php COOKIES : الكوكيز


دور الكوكيز هو الحفاظ مؤقّتاً على بيانات الزائر ، و التي تعتبر بمثابة هوية له ، تسهل عليه عملية الإبحار في الموقع المعني . تُخزّن على حاسوبه عن طريق متصفّحه و بأمر من الخادوم .
كلما أراد المستخدم زيارة صفحة ما ، يتم إرفاق طلبه بالكوكيز أيضا .

في هذا الدّرس :
  • php إنشاء الكوكيز
  • php استخلاص محتوى الكوكيز
  • php حذف الكوكيز
  • الإستخدام السليم للكوكيز

( )php setCookie

تتيح لنا الدّالة الجاهزة ( )setCookieإنشاء الكوكيز : setcookie( قيمته,اسم الكوكيز ) .

لإنشاء كوكيز نخزن فيه اسم العضو مثلا :
<?php
setCookie("user", "sameh");
?>

 يجب كتابة الدالة setCookie() قبل كتابة أي وسم html . و قبل القيام بأي عملية عرض باستخدام echo أو print

<?php
setCookie("user", "sameh");
?>

<!DOCTYPE html>
<html dir="rtl">
<head>
</head>
<body>
.....
</body>
</html>

هذه الطريقة هي أقصر شيفرة لإنشاء الكوكيز ، و ستنتهي مدّة صلاحيته بمجرّد غلق الزائر لمتصفّحه ، ثم يتم حذفه من على حاسوبه . أمّا إذا أردنا التحكم في هذه المدّة ، يجب إضافة عامل ثالث للدالة setCookie . و هو عامل الوقت و يتم تحديده باستعمال دالة من دوال الوقت : time( )
تعطينا الدالة time الوقت الحالي ، و ذلك باحتساب عدد الثواني التي مرّت منذ سنة 1970 .
لتحديد مدّة صلاحية الكوكيز بعد انتهاء ساعة واحدة مثلا ، نقوم بتحويل ساعتنا إلى عدد الثواني أي ( 60 دقيقة * 60 ثانية ) ، ثم نضيفها إلى الوقت الحالي ()time :
<?php
setCookie('user', 'Sameh', time() + 60*60);
?>
بعد مضي ساعة من دخول العضو إلى الموقع تنتهي مدّة صلاحية هذا الكوكيز ، و يُحذف من حاسوبه .

إضافة أكثر من كوكيز

لإضافة كوكيز آخر ، نستعمل نفس الطريقة التي أنشأنا بها الأول .
مثلا لإنشاء كوكيز آخر يُخزّن دولة العضو :
<?php
setCookie('user', 'sameh', time() + 60*60);
setCookie('country', 'USA', time() + 60*60);
?>

تعديل الكوكيز

لتغيير مدّة صلاحية الكوكيز . مثلا نريد لهذه المدّة أن تدوم شهرا بدل ساعة . نأخذ الكوكيز السابق بدل ساعة نضيف عدد الثواني التي تناسب الشهر ، و يمكننا أيضا تغيير قيمته :
<?php
setCookie('user', 'sameh', time() + 30*24*60*60);
setCookie('country', 'masr', time() + 30*24*60*60);
?>

استخلاص محتوى الكوكيز

لعرض محتوى الكوكيز ، نلجأ إلى المتغير الُمحدّد الشامل $_COOKIE
<?php
// لاستخلاص محتوى الكوكيز
echo $_COOKIE['user'];
echo $_COOKIE['country'];

// لعرض جميع الكوكيزات
print_r($_COOKIE);
?>

حذف الكوكيز

لحذف الكوكيز ، نستعمل نفس الطريقة التي أنشأناه بها ، لكن هذه المرّة يجب تحديد الوقت في الماضي ، و ذلك بإضافة علامة ناقص "-"
<?php
setCookie("user", "sameh", time() - 30*24*60*60);
setCookie("country", "masr", time() - 30*24*60*60);
?>

حماية الكوكيز

بالإضافة إلى العوامل الثلاث التي رأيناها ، يمكننا إضافة أربع عوامل أخرى للدالة setCookie .
setCookie(name, value, time, domaine, subdomaine, secured, HTTPonly )
  • 4 - domaine: مبدئيا هذه القيمة تساوي null أو "/" . أي أن المتصفح سيقوم بإرسال الكوكيز إلى جميع صفحات موقعنا . لجعله صالحا فقط لملف محدّد من موقعنا ، مثلا ملف العضو profile . نُحدّد الرابط إليه
    setCookie("user", "Sameh", time() - 30*24*60*60, "/profile/")
    سيقوم المتصفح بإرسال الكوكيز فقط إلى مجال http://www.example.com/profile و ليس إلى http://www.example.com و لا إلى http://www.example.com/admin ...
  • 5 - subdomaine : نفس الشيء بالنسبة للعامل السابق ، هنا نقوم بتضييق الخناق ، مثلا تحديد ملف معين داخل ملف profile ...
  • 6 - secured : سيتم إرسال الكوكيز فقط إلى الصفحات المحمية برخصة تشفير ، مثلا رخصة SSL : https://...
  • 7 - HttpOnly : هذه القيمة تهمنا كثيرا ، مبدئيا تأخذ false لكن إذا فعلناها ، و هذا ما يجب عليكم فعله ، لحماية أعضاء موقعكم بشكل كبير من عملية سرقة كوكيزاتهم عبر ثغرة XSS . تذكّروا دائما أن تكون قيمتها هي true ، و تمنعون بذلك قراءة الكوكيزات من طرف عدة لغات كjavascript
سنحتاج إلى القيمة السابعة فقط و لهذا سنعطيها true و القيم الأخرى لا شيء
<?php
setCookie('user', 'Sameh', time() + 30*24*60*60, null, null, false, true);
setCookie('country', 'masr', time() + 30*24*60*60, null, null, false, true);
?>
و أخيرا لا تنسوا دائما تنظيف المتغيرات أثناء العرض ، كما تعلمتم
  if (isset($_COOKIE['user']) AND isset($_COOKIE['country']))
{
$user = htmlspecialchars($_COOKIE['user']);
$country = htmlspecialchars($_COOKIE['country']);

echo $user;
echo $country;
}

التطبيق

إلى لوحة مفاتيح حاسوبكم ، سنرى مثالا لاستعمال الكوكيز :
تخيلوا بأن الزائر حط رحاله لأول مرة على موقعكم ، و قبل البدء في الإبحار ، تطلبون منه التعريف عن نفسه و ذلك بملأ استمارة تسجيل الدّخول . و بعد نجاحه في القيام بذلك ، تريدون أن تخزنوا بياناته في كوكيز ، ثم عرض اسمه على جميع الصفحات التي يزورها. و سنحدد مدة الصلاحية في سنة و بالتالي نعفيه من ملأ الإستمارة في كل مرة يزور موقعكم .

سنحتاج إذاً لصفحتين على الأقل :
  • index.php : صفحة الإستقبال ، ستتضمن استمارة تسجيل الدّخول
  • validate.php : صفحة معالجة بيانات الإستمارة و إنشاء الكوكيز
في هذه المرحلة ، يمكنكم حل هذا التمرين لوحدكم . أدعوكم أن تحاولوا قبل رؤية الحل ، كونوا على يقين بأن أسرع طريقة للتعلم ، هي عن طريق المحاولة و الخطأ .

index.php

<!DOCTYPE html>
<html dir="rtl">
<head>
<meta charset="utf-8">
<style>
label{display:inline-block;width:100px;}
</style>
</head>
<body>

<?php
// إذا كان الكوكيز موجودا ، نستقبل العضو بكلمة ترحاب
if (isset($_COOKIE['user']) AND isset($_COOKIE['country']))
{
$user = htmlspecialchars($_COOKIE['user']);
$country = htmlspecialchars($_COOKIE['country']);

echo '<p>مرحبا بك : <strong>'.$user.' من '.$country.'</strong><p>';
echo '<p>أنت الآن في صفحة الإستقبال <p>';
}
else // أما إذا كان الكوكيز غير موجود ، ندعو الزائر لملأ الإستمارة
{
?>

<p> الكوكيز غير موجود !! <br> يريد الموقع تخزين معلومات عنك ، و لفعل ذلك نرجو منك ملأ الإستمارة التالية : </p>

<form action="validate.php" method="post">
<label for="pseudo"> اسم المستخدم </label>
<input type="texte" name="pseudo" id="pseudo"><br>
<label for="pays"> البلد </label>
<input type="texte" name="pays" id="pays">
<p><input type="submit" value="إرسال"></p>
</form>
<?php
}
?>

<p> الإنتقال إلى صفحة <a href="validate.php"> validate.php </a></p>

</body>
</html>

validate.php

<?php
If (isset($_POST['pseudo'])AND isset($_POST['pays']) )
{
$temps = 365*30*24*60*60;
setcookie ("user", $_POST['pseudo'], time() + $temps,null, null, false, true);
setcookie ("country", $_POST['pays'], time() + $temps,null, null, false, true);
header("Location: index.php"); // التحويل التلقائي إلى صفحة الإستقبال
}else{
?>

<!DOCTYPE html>
<html dir="rtl">
<head>
<meta charset="utf-8">
<style>
label{display:inline-block;width:100px;}
</style>
</head>

<body>
<?php
if (isset($_COOKIE['user']) AND isset($_COOKIE['country']))
{
$user = htmlspecialchars($_COOKIE['user']);
$country = htmlspecialchars($_COOKIE['country']);

echo '<p> مرحبا بك : <strong>'.$user.' من '.$country.'</strong> ! لقد قمت بالتعريف عن نفسك ، ليس لديك ما تفعله هنا .</p>';
}
else
{
echo '<p> المرجو منك ملأ استمارة الدخول الموجودة في صفحة الإستقبال</p>';
}
?>

<p>العودة إلى صفحة الإستقبال <a href="index.php"> index.php </a></p>

</body>
</html>
<?php
}
?>


في أغلب الأحيان ، يُنظَرُ إلى الكوكيز كأنه مصدر تهديد . لكن الأمر غير ذلك فهو عملي في مجموعة من الحالات ،
الكوكيزات هي ملفات صغيرة مخزنة على حاسوبكم ، تسهل عليكم الإبحار في المواقع التي تزورونها . للإطلاع عليها أو حذفها ، مثلا على متصفح Mozilla FireFox ستجدونها على شريط الخيارات أعلى :
Tools -> Options -> privacy -> remove individual cookies أو
Outils -> Options -> Vie Privée -> supprimer des cookies spécifiques

و ستحصلون على لائحة كل كوكيزات المواقع التي زرتموها .