السلام عليكم,
لنري هذا المثال
كود PHP:
<?php
session_start();
$_SESSION['visits'] = ( isset($_SESSION['visits']) ) ? ++$_SESSION['visits'] : 1;
echo $_SESSION['visits'];
?>
قم بحفظ الكود التالي في ملف المجلد الرئيسي بسيرفرك الشخصي بإسم session.php مثلا ثم قم بنسخ الرابط التالي واستدعائه في متصفحك وقم بعمل refresh حتي يصبح الرقم الناتج 5 مثلا ..
كود:
http://localhost/session.php?PHPSESSID=1234
الآن قم بغلق نافذة المتصفح وافتحه مرة أخري
ملحوظة: لاتقم بفتح tab جديد مثلا أو ضغط CTRL+N.
استدعي نفس الرابط في المتصفح مرة أخري. ماذا تري؟ يظهر الرقم 6 ؟
استدعي نفس الرابط في متصفح آخر ؟ يظهر الرقم 7 ؟
التصرف الطبيعي أن هذه جلسة جديدة فلابد أن يقوم العداد بالعد من البداية واظهار رقم 1 في كل مرة. ولكن الذي حدث هو أننا فرضنا التعامل بمعرِّف الجلسة الذي حددناه بنفسنا في كل مرة وهذه عملية الـ Session fixation
معني ذلك أنك بمجرد تسجيل دخولك في لوحة تحكم موقعك عن طريق رابط يحتوي علي معرِّف جلسة أرسله لك مهاجم, فهو يستطيع في نفس اللحظة أن يقوم بنسخ نفس الرابط الي متصفحه والدخول الي لوحة تحكم موقعك التي سجلت أنت دخولك بها مسبقاً.
ما الحل؟ وكيف تحمي نفسك ؟؟؟ عن طريق استخدام دالة session_regenerate_id . وبالتالي حتي عندما تقوم بتسجيل دخولك عن طريق الرابط الذي أرسله المهاجم, فإن معرِّف الجلسة الذي أرسله لك سيتغير وبالتالي يصبح معرِّف جلستك مجهولاً لديه. وهكذا أنت أفسدت عليه محاولة اختراقك :funny:
الكود بعد التعديل
كود PHP:
<?php
session_start();
if( !isset($_SESSION['regen']) )
{
session_regenerate_id();
$_SESSION['regen'] = true;
}
$_SESSION['visits'] = ( isset($_SESSION['visits']) ) ? ++$_SESSION['visits'] : 1;
echo $_SESSION['visits'];
?>
ملحوظة: قمت بتعريف متغير تأكيدي داخل الشرط وذلك حتي لا يتم تغيير معرِّف الجلسة مع كل تحديث للصفحة.
الآن قم بتنفيذ نفس الخطوات السابقة مع ملاحظة تغيير المعرِّف (أو حذف الكعكات) 
لذلك أري ضرورة استخدام الدالة