الاثنين، 13 سبتمبر، 2010

شرح تفصيلى للكوكيز فى لغة php + تطبيق عملى رائع

أحمد | 1:57 ص |
http://0.tqn.com/d/kidscooking/1/0/_/T/-/-/peanut-butter-cookies-drizzle-big.jpg







السلام عليكم و رحمة الله و بركاتة
أولا و قبل أى شى هذا الشرح اهداء من الأكاديمية العربية للتصميم وبرمجة تطبيقات الانترنت
رفانا بالجميل و تقديرا لهذا المنتدى و الآن لنبدأ
ممكن تكون سمعت عن الكوكيز او الكعكات كما يطلق عليها ( نرفض هذا الاسم ) . لكن ما هى الكوكيز و ماذا يمكننا ان نفعل باستخدام الكوكيز .
سوف نركز فى هذا الدرس على معرفة اساسيات الكوكيز و استخداماتها فى تطبيقات الانترنت المختلفة .
سوف نتعلم ايضا كيفية استخدام الكوكيز فى لغة php بالاضافة الى اتباع افضل وسائل الحماية اثناء استخدامهم .
بعد ان تقرأ هذا الدرس سوف تكون على دراية كاملة باساسيات الكوكيز و كيفية استخدامها بطريقة امنة فى تطبيقات الانترنت التى تقوم بتنفيذها .
الخطوة الأولى : فهم الكوكيز .
الخطوة الأولى فى رحلتنا هى اكتشاف ما هى الكوكيز . حتى اذا سبق لك التعامل مع الكوكيز سوف تجد هذا الجزء مفيد لك ....لذلك ابقى معى ...!
بمنتهى الوضوح .....!
بامكانك تعريف الكوكيز على انها ملفات نصية يقوم السيرفر بحفظها على جهازك الخاص من خلال توجيه اوامر الى المتصفح الذى تستخدمة . فيقوم المتصفح بتكوين هذة الملفات و بعد ان تتم تلك العمليه . يصبح بامكان السيرفر قراءة تلك الملفات و التعرف عليها و كذلك الكتابة فيها .قد تكون هذة العملية خطيرة الى حد ما فالكثير منا لا يحبون وجود ملفات يتم التحكم فيها من السيرفر على اجهزتهم الشخصية .
لذلك هناك بعض القيود التى يمكننا فرضها على تلك العملية لنجعلها امنه قدر الامكان .
- بامكان السيرفر الدخول الى الكوكيز التى تم حفظها باستخدام الدومين الخاص به او الدومين الفرعى التابع له فقط .
على سبيل المثال : ملفات الكوكيز التى يقوم google.com بتكوينها لا يمكن قرائتها بواسطة mozilla.com . و ملفات الكوكيز التى يكونها mozilla.com لا يمكن قرائتها بواسطة google.com
- طبقا لشروط بروتوكول HTTP فان اقصى حجم لملف الكوكيز الواحد هو 4096 بايت( 4 كيلوبايت) .
- هناك عدد محدد من ملفات الكوكيز المسموح بها لكل دومين ( لكل موقع ) مع العلم ان العدد يختلف حسب نوع المتصفح الذى تستخدمه و لكن بصفة عامة اقصى عدد هو 20 ملف
- هناك عدد محدد من ملفات الكوكيز المسموح بها على القرص الصلب الخاص بك و ايضا يختلف هذا العدد باختلاف نوع المتصفح . و لكنها غالبا فى حدود 300 ملف و اذا تم اجتياز هذا الرقم يتم حذف اقدم ملف تم تكوينه قبل تكوين اى ملف جديد .
- لكل ملف كوكيز مهلة ينتهى بعدها . و بالتالى فان المتصفح بامكانه حذف هذا الملف اذا انتهت تلك المهلة و بالتالى فان الملف لم يعد مطلوب بواسطة السيرفر و يتم حذفة .
- اذا لم يتم تحديد مهلة ينتهى بعدها ملف الكوكيز فان المتصفح يقوم بحذف ملف الكوكيز هذا بمجرد اغلاق الاتصال مع السيرفر او اغلاق المتصفح .
- عادة ما يطلق على هذا النوع من ملفات الكوكيز ( التى لا تحتوى على مهلة انتهاء ) اسم جلسات الكوكيز و تستخدم لحفظ بيانات مؤقتة فقط يتم حذفها بمجرد اغلاق المتصفح .
لنتعرف على الكوكيز تقنيا ...!
الآن دعنا نتعرف على الكوكيز من الناحية التقنية . يتم انتقال البيانات المكتوبة داخل ملف الكوكيز باستخدام البروتوكول HTTP .و هذا البروتوكول يقوم امتصفح الانترنت باستخدامه لارسال و استقبال البيانات من و الى السيرفر
الكود التالى مثال على امر موجه من السيرفر الى المتصفح لتكوين ملف كوكيز جديد

كود:
Set-******: Name=content data; expires=Fri, 31-Dec-2010 23:59:59 GMT; path=/; domain=.example.net
لا تقلق فالعمليه بسيطة جدا و لا تحتوى على اى تعقيدات .
و الآن مع شرح الكود السابق
Set-****** : هو أمر يتم موجه من السيرفر الى المتصفح بحيث يقوم السيرفر باخبار المتصفح بانه يريد تكوين ملف كوكيز جديد .
name : هو اسم ملف الكوكيز الذى يطلب السيرفر تكوينه . مع العلم ان كل دومين من الممكن ان يكون مجموعة من ملفات الكوكيز و لكل منها اسم خاص به مختلف عن الآخر . و بالتالى يستطيع المتصفح تكوين كل ملف بمفردة .
بعد كتابة اسم الكوكيز نضع علامة ( = ) و تأتى بعدها content data و هى عبارة عن البيانات المطلوب كتابتها فى ملف الكوكيز المحدد اسمه و تلك البيانات من الممكن ان تكون نصية او رقمية ( نصوص او ارقام ) و كما ذكرنا سابقا لا يتعدى حجم الملف 4 كيلوبايت .
expires : هو الأمر الذى يحدد مهلة انتهاء ملف الكوكيز التى ذكرناها سابقا
و يتم كتابه التاريخ بالصيغة التالية :


كود:
DD-Mon-YYYY HH:MM:SS GMT
حيث dd هو اليوم و mon هو الشهر و yyyy هى السنة . و hh مقصود بها الساعات و mm مقصود بها الدقائق و ss مقصود بها الثوانى . و لا يظهر التاريخ للمستخدمين . و بالتالى بوجود هذة الميزة نوفر عامل امان هام و كذلك المساحاة على القرص و ذلك لان المتصفح يقوم بحذف الكوكيز بعد انتهاء تاريخه
domain : الاسم هنا هو اسم الموقع الذى يمتلك القدرة على قراءة و كتابة ملف الكوكيز . على سبيل المثال اذا كان الـ domain هنا هو ads.google.com فان الكوكيز سوف يتم ارساله الى السيرفر الخاص بهذا الدومين فقط و اذا كان الـdomain هنا هو google.com فان الكوكيز سوف يتم ارسالة الى السيرفر الخاص بهذا الدومين و الدومينات الفرعية subdomains
التابعة له ايضا .
path : المسار هنا هو مسار ملف الكوكيز الذى سيتم ارسالة عليه السيرفر ( المكان الذى سيتم ارسال الملف اليه على السيرفر ) مثلا اذا كان المسار هنا هو '/images/' و الدومين هو ads.google.com سوف يتم ارسال ملف الكوكيز الى السيرفر فقط عندما يطلب المتصفح ملف موجود على السيرفر داخل المسار التالى ‘ads.google.com/images/’
و اذا كانت path هنا قيمتها " / " فقط سوف يتم ارسال ملف الكوكيز الى السيرفر بصرف النظر عن مكان الملف المطلوب على السيرفر .
و الآن سوف يتم تطبيق استخدام تلك الخصائص فى لغات البرمجة المختلفة .
كيفية تكوين و قراءة ملف الكوكيز ؟
سوف نركز هنا على تكوين و قراءة ملفات الكوكيز باستخدام لغة php .
بالنسبة للغة php

كود:
/***تكوين ملف الكوكيز***/
$name = 'اسم الملف ';
$value = 'قيمته ';
//time()      هذة الدالة تعطى الوقت الحالى بالثوانى و نحن هنا نستخدم 60ثانية *30 =30 دقيقة
//و بالتالى فان ملف الكوكيز سوف ينتهى فى خلال 30 دقيقة
//ربما لاحظت ان الزمن الانتهاء هنا تم تخصيصة بالثوانى
// لغة بى اتش بى تقوم بتحويله الى الصيغة الصحيحة اتوماتيكيا
$expireDate = time() + 60 * 30;
$path = '/example/';
$domain = 'test.domain.com';
$secure = false; //هذا المتغير يشترط ارسال ملف الكوكيز فقط فى حالة وجود اتصال https
$httponly = true; //يشترط هذا المتغير تفعيل و ارسال ملف الكوكيز فقط فى حالة وجود اتصال http
set******( $name, $value, $expireDate, $path, $domain, $secure, $httponly);

.... //نقوم بوضع باقى محتويات الصفحة هنا
?>
الآن الكود السابق تم شرحه باستثناء المتغيرات التالية secure$ و httponly$ و يتم استخدامها لتحديد كيفية ارسال الملف الى السيرفر
المتغير secure يستخدم لكى يتم ارسال ملف الكوكيز فقط فى حالة وجود اتصال https و يتم ذلك اذا كانت قيمته هى true و لكن الوضع الافتراضى لها هنا هو false لاننا سنستخدم اتصال http
المتغير httponly : يقوم هذا المتغير بارسال الكوكيز فقط فى حالة وجود اتصال http متاح و يتم تخصيص قيمته الى true و هذا يعنى منع لغات البرمجة من جهة العميل من استخدام الكوكيز و هذا لدواعى امنية و منع عمليات الاختراق باستخدام cross site ******ing .
و لمنع سوء الفهم فان المتغير httponly لا يعنى عدم امكانية ارسال الكوكيز من خلال اتصال https و لكن الافضل استخدام http فقط .
الكود السابق تم كتابته بالتفصيل للتوضيح فقط و يمكن كتابته و اختصاره بالشكل التالى :


كود:
set******( 'قيمته', 'اسم الملف ', time()+60*30, '/example/', 'test.domain.com', false,true);
?>
الآن تعلمنا كيفية انشاء ملفات الكوكيز و يجب ايضا ان نتعلم كيفية قرائتها و لحسن الحظ فان لغة php توفر لنا دالة جاهزة و هى [ ]******_$ تمكننا من قراءة ملفات الكوكيز بسهوله فقط من خلال وضع اسم ملف الكوكيز المطلوب قراءتة بين القوسين


كود:
$******Value = $_******['اسم ملف الكوكيز '];
?>
اذا كنت تريد تغيير اى بيانات داخل ملف الكوكيز الذى تم انشاؤه مثل المسار path و تاريخ انتهاء مهلة الملف و الدومين فكل ما عليك هو انشاء ملف كوكيز جديد بنفس اسم ملف الكوكيز القديم باستخدام الدالة التالية ( )set******
ماذا يمكننا ان نفعل باستخدام ملفات الكوكيز ؟
يتم استخدام الكوكيز فى كل شى تقريبا مثل حفظ اعدادات المستخدم مثل الاسم و اللغة و الموقع و دقة الشاشة . فهذا يساعد على تطوير الخدمة التى تقدمها الى العملاء او المستخدمين و ذلك من خلال حفظ الاعدادات المفضلة للعملاء . على سبيل المثال يتم حفظ اللغة التى اختارها العميل فى ملف كوكيز بحيث يتم عرض محتوى الموقع باللغة التى قام العميل باختيارها دون الحاجة الى ضبط الاعدادات فى كل مرة .
هل تعلم ان ؟
شركة netscape هى الشركة التى اخترعت الكوكيز و كان ذلك بغرض استخدامه فى عمل عربة تسوق للعملاء shopping cart و الغرض من الكوكيز هنا هو ابقاء مشتريات المستخدمين داخل عربة التسوق حتى بعد قطع الاتصال بالموقع او اغلاق المتصفح
تدريب عملى .!
الآن سوف نشرح تطبيق عملى على استخدام الكوكيز و هو كيفية عمل خاصية " تذكرنى " او " Remember me " اثناء تسجيل الدخول للمواقع .
قبل ان نبدأ فان المثال التالى يحتوى على اكواد mysql لا تقلق . بامكانك فهم الكود التالى اذا كانت لديك هبرة بسيطة باساسيات php و ملفات الكوكيز التى تم شرحها .
لكى نقوم بعمل تطبيق " تذكرنى " فى نموذج تسجيل الدخول فاننا سوف نفترض وجود جدول فى قاعدة بيانات يحتوى على الحقول التالية " اسم المستخدم , كلمة السر , الكود الأمنى ". حيث يتم تخصيص مجموعة حروف عشوائية او ارقام للتعرف على المستخدمين بشكل آمن . الحروف العشوائية او الارقام هى الكود الأمنى الذى ذكرناه فى جدول قاعدة البيانات .
ملحوظة : هذة الفكرة يتم استخدامها فى سكريبت ووردبريس و تسمى table prefix و يتم تغييرها اثناء تثبيت المدونة لضمان مستوى امان عالى .
و فى هذا المثال سوف نستخدم " SHA1 " .
العديد من المبرمجين يقوموا بوضع اسم المستخدم و كلمة السر فى ملف كوكيز و ارسالهم الى السيرفر و تلك العمليه تمثل خطورة كبيرة و يجب تجنبها لأن الكوكيز يتم ارسالة الى السيرفر باستخدام اتصال غير آمن و بالتالى فان الملفات تصبح هدفا للمخترقين .
ميكانيكية عمل الكود التالى :
هى قيام المستخدم بتسجيل الدخول و بعدها يقوم بتسجيل الخروج و من ثم يحاول تسجيل الدخول الى موقع مرة اخرى
خطوات العملية :
1- قيام المستخدم بتسجيل الدخول .
2- بعد استقبال اسم المستخدم يقوم الموقع بعمل كود امنى خاص للمستخدم باستخدام قيمتين عشوائيتين و اسم المستخدم
3 - ارسال الكود الامنى الذى تم انشاؤة الى قاعد البيانات
4 - تكوين ملف الكوكيز و حفظ الكود الأمنى بداخلة
5- تسجيل الخروج
6- عند قيام المستخدم بتسجيل الخروج فان ملف الكوكيز يظل موجود حتى تاريخ انتهاؤه
7 - عند قيام المستخدم بتسجيل الدخول مرة اخرى يتم قراءة محتويات ملف الكوكيز للتعرف على المستخدم
8 - فحص و تنقيه محتويات ملف الكوكيز
9 - استخراج الكود الأمنى الذى تم انشاؤة سابقا عند محاولة تسجيل الدخول الأولى و البحث عنه فى قاعدة البيانات
10 - التأكد من وجود الكود الأمنى فى قاعدة البيانات و اذا كان موجود يقوم الموقع باظهار رسالة ترحيب للمستخدم و اذا لم يكن موجود يخبره بفضل المحاولة
و الآن مع الكود


كود:
//هذا الكود يفترض قيام العضو بتسجيل دخوله مسبقا
/****تكوين الكود الأمنى للتعرف على المستخدمين ****/
$username; //بالتأكيد تم التعرف على اسم المستخدم اثناء تسجيل دخوله
//تكوين الكود الأمنى باستخدام قيمتين عشوائيتين و اسم المستخدم
$digest = sha1(strval(rand(0,microtime(true)) + $username + strval(microtime(true));
//ارسال الكود الأمنى الى قاعدة البيانات -بفرض وجود اتصال تم انشاؤه مسبقا
mysql_query('UPDATE users SET reloginDigest="'.$digest.'" WHERE username="'.$username.'"');
//تكوين ملف الكوكيز الذى يحتوى على البيانات
set******( 'reloginID', $digest, time()+60*60*24*7,'/', 'test.example.com', false, true);
//هذا الكود يفترض قيام العضو بتسجيل الخروج بعد انشاء ملف الكوكيز
/****التعرف على المستخدم من خلال ملف الكوكيز ****/
$digest = $_******['reloginID'];
$digest = mysql_real_escape_string($digest); //تصفيه اى محتوى ضار فى بيانات الكوكيز
//البحث عن الكود الأمنى فى قاعدة البيانات
$result = mysql_query('SELECT username FROM users WHERE reloginDigest="'.$digest.'"');
//التأكد من وجود الكود الأمنى فى قاعدة البيانات
if(mysql_num_rows($result) == 1){
$userdata  = mysql_fetch_object($result);
$username = $userdata->username;
//يتم كتابة رسالة ترحيب هنا توضح نجاح العمليه اذا اجتاز الخطوات السابقة بنجاح
echo 'You have successfully logged in, '.$username;
} else{
//يتم هنا كتابة رسالة تظهر اذا لم يتم التعرف على الكود الأمنى للمستخدم
echo "failed to login!";
}
?>
ملحوظة هامة : باستخدام الكود الأمنى كما وضحنا فى المثال السابق فان احتمالية تشابه الاكواد الأمنية لثنين من المستخدمين قليلة جدا و من الناحية النظرية فانه يتم توليد قيم عشوائية تختلف باستخدام اسم المستخدم الذى تتم كتابته او ادخالة بواسطة المستخدم . و يجب عليك تحديد مهله صلاحية معينة للكود الأمنى فعلى سبيل المثال فان الكود الأمنى لا يصبح فعال او نشط بعد مرور زمن معين . و فائدة هذة الجزئية هى منع المخترقين من سرقة الكوكيز من احد المستخدمين الموجودين و تسجيل الدخول باسمائهم .
لقد وصلنا الى نهاية هذا الدرس و احب ان اوضح بعض الملاحظات الهامة
- لا تقوم بوضع اى بيانات حساسة داخل ملفات الكوكيز فربما يكون المستخدم يستخدم جهاز عام فى سايبر مثلا . لذلك لا تترك اى بيانات هامة فى ملفات الكوكيز .
- لا تثق ابدا فى اى بيانات يتلقاها موقعك من خلال ملفات الكوكيز و قم بتصفيه البيانات التى يستقبلها موقعك . فمن الممكن ان يقوم المخترقين بكتابة بيانات ضارة داخل ملفات الكوكيز و ارسالها الى موقعك لذلك يجب تصفية و تأمين البيانات التى تتلقاها.
- دائما . قم بتحديد تاريخ انتهاء صلاحية ملف الكوكيز لزيادة معامل الأمان .
- اثناء تكوين ملفات الكوكيز قم باستخدام المتغيرات التالية httponly و secure حسب نوعية التطبيق الذى تقوم بتنفيذة . مثلا اذا كان موقعك لا يقوم بتعديل ملفات الكوكيز باستخدام java****** فقم بتفعيل المتغير httponly .
- اذا كان لديك اتصال https فقم تفعيل الخيار secure فهذا يضمن لك نزاهة و سرية البيانات .
انتهى الدرس اتمنى لكم اقصى استفادة ممكنة






ارجو الدعاء اخوكم احمد

هناك تعليقان (2):

  1. جزاك الله خير الجزاء ..

    موضوع جميل , كان عندي اختبار واستفدت من موضوعك

    ردحذف
  2. بارك الله فيك يسعدني جدا سماع ذلك

    ارجو من الله التوفيق لك

    ردحذف

Twitter Delicious Facebook Digg Stumbleupon Favorites More

Search