php المتغيرات الشاملة المحدّدة

php COOKIES : الكوكيز

آخر تحيين: 09-01-2015

php SESSIONS : الجلسات بروتوكول HTTP


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

في هذا الدّرس :

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

( )php setCookie

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

لإنشاء كوكيز نخزن فيه اسم العضو مثلا :

<?php
setCookie("user", "عمر بن زيد");
?>
يجب كتابة الدالة setCookie() قبل كتابة أي وسم html . و قبل القيام بأي عملية عرض باستخدام echo أو print

<?php
setCookie("user", "عمر بن زيد");
?>
<!DOCTYPE html>
<html dir="rtl">
<head>
</head>
<body>
   .....
</body>
</html>

هذه الطريقة هي أقصر شيفرة لإنشاء الكوكيز ، و ستنتهي مدّة صلاحيته بمجرّد غلق الزائر لمتصفّحه ، ثم يتم حذفه من على حاسوبه . أمّا إذا أردنا التحكم في هذه المدّة ، يجب إضافة عامل ثالث للدالة setCookie . و هو عامل الوقت و يتم تحديده باستعمال دالة من دوال الوقت : time( )
تعطينا الدالة time الوقت الحالي ، و ذلك باحتساب عدد الثواني التي مرّت منذ سنة 1970 .
لتحديد مدّة صلاحية الكوكيز بعد انتهاء ساعة واحدة مثلا ، نقوم بتحويل ساعتنا إلى عدد الثواني أي ( 60 دقيقة * 60 ثانية ) ، ثم نضيفها إلى الوقت الحالي ()time :

<?php
  setCookie('user', 'عمر بن زيد', time() + 60*60);
?>

بعد مضي ساعة من دخول العضو إلى الموقع تنتهي مدّة صلاحية هذا الكوكيز ، و يُحذف من حاسوبه .

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

لإضافة كوكيز آخر ، نستعمل نفس الطريقة التي أنشأنا بها الأول .
مثلا لإنشاء كوكيز آخر يُخزّن دولة العضو :

<?php
setCookie('user', 'عمر بن زيد', time() + 60*60);
setCookie('country', 'المغرب', time() + 60*60);  
?>

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

لتغيير مدّة صلاحية الكوكيز . مثلا نريد لهذه المدّة أن تدوم شهرا بدل ساعة . نأخذ الكوكيز السابق بدل ساعة نضيف عدد الثواني التي تناسب الشهر ، و يمكننا أيضا تغيير قيمته :

<?php
  setCookie('user', 'عمر بن زيد', time() + 30*24*60*60);
  setCookie('country', 'فلسطين', time() + 30*24*60*60);
?>

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

لعرض محتوى الكوكيز ، نلجأ إلى المتغير الُمحدّد الشامل $_COOKIE

<?php
// لاستخلاص محتوى الكوكيز
echo $_COOKIE['user'];
echo $_COOKIE['country'];

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

حذف الكوكيز

لحذف الكوكيز ، نستعمل نفس الطريقة التي أنشأناه بها ، لكن هذه المرّة يجب تحديد الوقت في الماضي ، و ذلك بإضافة علامة ناقص "-"

<?php
  setCookie("user", "عمر بن زيد", time() - 30*24*60*60);
  setCookie("country", "فلسطين", time() - 30*24*60*60);
?>

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

بالإضافة إلى العوامل الثلاث التي رأيناها ، يمكننا إضافة أربع عوامل أخرى للدالة setCookie .

setCookie(name, value, time, domaine, subdomaine, secured, HTTPonly )
  • 4 - domaine: مبدئيا هذه القيمة تساوي null أو "/" . أي أن المتصفح سيقوم بإرسال الكوكيز إلى جميع صفحات موقعنا . لجعله صالحا فقط لملف محدّد من موقعنا ، مثلا ملف العضو profile . نُحدّد الرابط إليه
    setCookie("user", "عمر بن زيد", time() - 30*24*60*60, "/profile/")

    سيقوم المتصفح بإرسال الكوكيز فقط إلى مجال http://www.mySite.com/profile و ليس إلى http://www.mySite.com و لا إلى http://www.mySite.com/admin ...

  • 5 - subdomaine : نفس الشيء بالنسبة للعامل السابق ، هنا نقوم بتضييق الخناق ، مثلا تحديد ملف معين داخل ملف profile ...
  • 6 - secured : سيتم إرسال الكوكيز فقط إلى الصفحات المحمية برخصة تشفير ، مثلا رخصة SSL : https://...
  • 7 - HttpOnly : هذه القيمة تهمنا كثيرا ، مبدئيا تأخذ false لكن إذا فعلناها ، و هذا ما يجب عليكم فعله ، لحماية أعضاء موقعكم بشكل كبير من عملية سرقة كوكيزاتهم عبر ثغرة XSS . تذكّروا دائما أن تكون قيمتها هي true ، و تمنعون بذلك قراءة الكوكيزات من طرف عدة لغات كjavascript

سنحتاج إلى القيمة السابعة فقط و لهذا سنعطيها true و القيم الأخرى لا شيء

<?php
  setCookie('user', 'عمر بن زيد', time() + 30*24*60*60, null, null, false, true);
  setCookie('country', 'فلسطين', 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

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