الفرق بين المراجعتين ل"PHP/session regenerate id"

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث
سطر 12: سطر 12:
 
عند تفعيل <code>session.use_trans_sid</code>، يجب أن يبدأ الإخراج بعد استدعاء الدالة<code>()session_regenerate_id</code>، والا سيُستعمل معرف الجلسة القديم.
 
عند تفعيل <code>session.use_trans_sid</code>، يجب أن يبدأ الإخراج بعد استدعاء الدالة<code>()session_regenerate_id</code>، والا سيُستعمل معرف الجلسة القديم.
  
== المعاملات ==
+
==المعاملات ==
<code>delete_old_session</code>
 
  
سواء قمت بحذف ملف الجلسة المرتبطة أم لا، يجب ألّا تمسح الجلسة القديمة  إذا أردت تجنب أو كشف هجمات hijack.
+
=== <code>delete_old_session</code> ===
 +
سواء قمت بحذف ملف الجلسة المرتبطة أم لا، يجب ألّا تمسح الجلسة القديمة إذا أردت تجنب أو كشف هجمات سرقة الجلسات.
  
 
== القيم المعادة ==
 
== القيم المعادة ==
تُعيد الدالة <code>session_regenerate_id()‎</code> القيمة <code>TRUE</code> في حالة نجاحها ووإلاّ فستُعيد القيمة <code>FALSE</code>.
+
تُعيد الدالة <code>session_regenerate_id()‎</code> القيمة <code>TRUE</code> في حالة نجاحها، وإلاّ فستُعيد القيمة <code>FALSE</code>.
  
 
== أمثلة ==
 
== أمثلة ==
المثال 1:مثال لاستعمال الدالة <code>session_regenerate_id()</code>‎<syntaxhighlight lang="php">
+
المثال 1: مثال عن استعمال الدالة <code>session_regenerate_id()</code>‎<syntaxhighlight lang="php">
 
<?php
 
<?php
  
سطر 29: سطر 29:
  
 
// المُدمرtime-stamp تحقق مِن
 
// المُدمرtime-stamp تحقق مِن
 
 
if (isset($_SESSION['destroyed'])
 
if (isset($_SESSION['destroyed'])
 
 
    && $_SESSION['destroyed'] < time() - 300) {
 
    && $_SESSION['destroyed'] < time() - 300) {
 
 
    // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
 
    // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
 
 
    // يمسح حالة جلسة هذا المُستخدم
 
    // يمسح حالة جلسة هذا المُستخدم
 
 
    remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
 
    remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
 
 
    throw(new DestroyedSessionAccessException);
 
    throw(new DestroyedSessionAccessException);
 
 
}
 
}
  
سطر 47: سطر 40:
  
 
// ضبط الفترة الزمنية لتدمير الجلسة
 
// ضبط الفترة الزمنية لتدمير الجلسة
 
 
$_SESSION['destroyed'] = time(); 
 
$_SESSION['destroyed'] = time(); 
  
 
// الدالة تقوم بحفظ بيانات الجلسة القديمة PHP 7.0.0 منذ إصدار
 
// الدالة تقوم بحفظ بيانات الجلسة القديمة PHP 7.0.0 منذ إصدار
 
// شاهد المثال التالي
 
// شاهد المثال التالي
 
 
session_regenerate_id();
 
session_regenerate_id();
  
 
// destroyed timestamp الدالة الجديدة لا تحتاج مُتغير التدمير
 
// destroyed timestamp الدالة الجديدة لا تحتاج مُتغير التدمير
 
 
unset($_SESSION['destroyed']);
 
unset($_SESSION['destroyed']);
  
سطر 62: سطر 52:
  
 
echo "Old Session: $old_sessionid<br />";
 
echo "Old Session: $old_sessionid<br />";
 
 
echo "New Session: $new_sessionid<br />";
 
echo "New Session: $new_sessionid<br />";
  
سطر 68: سطر 57:
  
 
?>
 
?>
 
+
</syntaxhighlight>الوحدة البرمجية المستخدمة للجلسة لا تسمح بالتعامل مع الشبكات غير المُستقرة، مِثل الهاتف المحمول و Wifi. لذا يجب إدارة معرف الجلسة عن طريق الدالة <code>session_regenerate_id()</code>‎ لتجنب فقدان الجلسة.
 
 
</syntaxhighlight>الوحدة البرمجية المستخدمة للجلسة  لا تسمح بالتعامل مع الشبكات غير المُستقرة، مِثل الهاتف المحمول و Wifi. لذا يجب إدارة معرف الجلسة عن طريق الدالة <code>session_regenerate_id()</code>‎ لتجنب فقدان الجلسة.
 
  
 
المثال 2: تجنب فقدان الجلسة عن طريق استعمال <code>session_regenerate_id()</code>‎<syntaxhighlight lang="php">
 
المثال 2: تجنب فقدان الجلسة عن طريق استعمال <code>session_regenerate_id()</code>‎<syntaxhighlight lang="php">
سطر 83: سطر 70:
  
 
function my_session_start() {
 
function my_session_start() {
 
 
    session_start();
 
    session_start();
 
 
    if (isset($_SESSION['destroyed'])) {
 
    if (isset($_SESSION['destroyed'])) {
 
 
       if ($_SESSION['destroyed'] < time()-300) {
 
       if ($_SESSION['destroyed'] < time()-300) {
 
 
           // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
 
           // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
 
           // يمسح حالة جلسة هذا المُستخدم
 
           // يمسح حالة جلسة هذا المُستخدم
 
 
           remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
 
           remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
 
 
           throw(new DestroyedSessionAccessException);
 
           throw(new DestroyedSessionAccessException);
 
 
       }
 
       }
 
 
       if (isset($_SESSION['new_session_id'])) {
 
       if (isset($_SESSION['new_session_id'])) {
 
 
           session_commit();
 
           session_commit();
 
 
           session_id($_SESSION['new_session_id']);
 
           session_id($_SESSION['new_session_id']);
 
 
           // يجب أن يظهر معرف  جديد للجلسة
 
           // يجب أن يظهر معرف  جديد للجلسة
 
 
           session_start();
 
           session_start();
 
 
           return;
 
           return;
 
 
       }
 
       }
 
 
   }
 
   }
 
 
}
 
}
  
 
function my_session_regenerate_id() {
 
function my_session_regenerate_id() {
 
 
    // يتطلب تحديد معرف  جديد مُناسب
 
    // يتطلب تحديد معرف  جديد مُناسب
    // عند فك ضبطه نتيجة
+
    // عند إلغاء ضبطه بسبب عدم استقرار الشبكة
 
 
 
    $new_session_id = session_create_id();
 
    $new_session_id = session_create_id();
 
 
    $_SESSION['new_session_id'] = $new_session_id; 
 
    $_SESSION['new_session_id'] = $new_session_id; 
  
    // destroy timestampضبط
+
    // destroy timestamp ضبط
 
 
 
    $_SESSION['destroyed'] = time();    
 
    $_SESSION['destroyed'] = time();    
  
 
    // كتابة و إنهاء الجلسة الحالية
 
    // كتابة و إنهاء الجلسة الحالية
 
 
    session_commit();
 
    session_commit();
  
 
    // إبدأ الجلسة بالمعرف  الجديد
 
    // إبدأ الجلسة بالمعرف  الجديد
 
 
    session_id($new_session_id);
 
    session_id($new_session_id);
 
 
    ini_set('session.use_strict_mode', 0);
 
    ini_set('session.use_strict_mode', 0);
 
 
    session_start();
 
    session_start();
 
 
    ini_set('session.use_strict_mode', 1);
 
    ini_set('session.use_strict_mode', 1);
 
    
 
    
 
    // الدالة لا تحتاج هذه المُتغيرات
 
    // الدالة لا تحتاج هذه المُتغيرات
 
 
    unset($_SESSION['destroyed']);
 
    unset($_SESSION['destroyed']);
 
 
    unset($_SESSION['new_session_id']);
 
    unset($_SESSION['new_session_id']);
 
 
}
 
}
 
 
?>
 
?>
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
سطر 163: سطر 120:
 
|-
 
|-
 
|7.0.0
 
|7.0.0
|تحفظ الدالة <code>session_regenerate_id()‎</code> بيانات الجلسة القديمة قبل إغلاقها
+
|تحفظ الدالة <code>session_regenerate_id()‎</code> بيانات الجلسة القديمة قبل إغلاقها.
 
|-
 
|-
 
|5.1.0
 
|5.1.0
|أُضيف المُعامل <code>delete_old_session</code>
+
|أُضيف المُعامل <code>delete_old_session</code>.
 
|-
 
|-
 
|4.3.3
 
|4.3.3
سطر 172: سطر 129:
 
|}
 
|}
  
== انظر أيضا ==
+
== انظر أيضًا ==
* <code>$_SESSION</code>
 
 
* الدالة <code>[[PHP/session is registered|session_is_registered()]]</code>‎: تتحقق من وجود (أو تسجيل) المتغير العام المُمرَّر إليها في الجلسة.
 
* الدالة <code>[[PHP/session is registered|session_is_registered()]]</code>‎: تتحقق من وجود (أو تسجيل) المتغير العام المُمرَّر إليها في الجلسة.
* الدالة <code>[[php/session unregister|()session_unregister]]</code>: تقوم بفك تسجيل  المتغير العام المُمرَّر إليها في الجلسة.
+
* الدالة <code>[[PHP/session unregister|()session_unregister]]</code>: تقوم بفك تسجيل المتغير العام المُمرَّر إليها في الجلسة.
  
 
== مصادر ==
 
== مصادر ==

مراجعة 13:09، 18 أغسطس 2018

(PHP 4 >= 4.3.2, PHP 5, PHP 7)

تُحدث الدالة session_regenerate_id()‎ معرف الجلسة الحالية عن طريق توليد معرف جديد.

الوصف

bool session_regenerate_id ([ bool $delete_old_session = FALSE ] )

تبدل الدالة session_regenerate_id()‎ معرف الجلسة  الحالية برقم جديد وتُبقي على باقي معلومات الجلسة الحالية.

عند تفعيل session.use_trans_sid، يجب أن يبدأ الإخراج بعد استدعاء الدالة()session_regenerate_id، والا سيُستعمل معرف الجلسة القديم.

المعاملات

delete_old_session

سواء قمت بحذف ملف الجلسة المرتبطة أم لا، يجب ألّا تمسح الجلسة القديمة إذا أردت تجنب أو كشف هجمات سرقة الجلسات.

القيم المعادة

تُعيد الدالة session_regenerate_id()‎ القيمة TRUE في حالة نجاحها، وإلاّ فستُعيد القيمة FALSE.

أمثلة

المثال 1: مثال عن استعمال الدالة session_regenerate_id()

<?php

// هذا المثال لا يعمل، إنما لتوضيح كتابة الدالة

session_start();

// المُدمرtime-stamp تحقق مِن
if (isset($_SESSION['destroyed'])
    && $_SESSION['destroyed'] < time() - 300) {
    // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
    // يمسح حالة جلسة هذا المُستخدم
    remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
    throw(new DestroyedSessionAccessException);
}

$old_sessionid = session_id();

// ضبط الفترة الزمنية لتدمير الجلسة
$_SESSION['destroyed'] = time(); 

// الدالة تقوم بحفظ بيانات الجلسة القديمة PHP 7.0.0 منذ إصدار
// شاهد المثال التالي
session_regenerate_id();

// destroyed timestamp الدالة الجديدة لا تحتاج مُتغير التدمير
unset($_SESSION['destroyed']);

$new_sessionid = session_id();

echo "Old Session: $old_sessionid<br />";
echo "New Session: $new_sessionid<br />";

print_r($_SESSION);

?>

الوحدة البرمجية المستخدمة للجلسة لا تسمح بالتعامل مع الشبكات غير المُستقرة، مِثل الهاتف المحمول و Wifi. لذا يجب إدارة معرف الجلسة عن طريق الدالة session_regenerate_id()‎ لتجنب فقدان الجلسة. المثال 2: تجنب فقدان الجلسة عن طريق استعمال session_regenerate_id()

<?php

/*

!هذا كود توضيحي ولا يعمل
دالة البداية ودالة توليد المعرف  تتجنبان فقدان الجلسات بواسطة الشبكات الغير مُستقرة بالإضافة إلى منع هجمات سرقة الجلسات

*/

function my_session_start() {
    session_start();
    if (isset($_SESSION['destroyed'])) {
       if ($_SESSION['destroyed'] < time()-300) {
           // لا يحدث عادةً إلا في حالة هجوم أو شبكة غير مُستقرة
           // يمسح حالة جلسة هذا المُستخدم
           remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
           throw(new DestroyedSessionAccessException);
       }
       if (isset($_SESSION['new_session_id'])) {
           session_commit();
           session_id($_SESSION['new_session_id']);
           // يجب أن يظهر معرف  جديد للجلسة
           session_start();
           return;
       }
   }
}

function my_session_regenerate_id() {
    // يتطلب تحديد معرف  جديد مُناسب
    // عند إلغاء ضبطه بسبب عدم استقرار الشبكة
    $new_session_id = session_create_id();
    $_SESSION['new_session_id'] = $new_session_id; 

    // destroy timestamp ضبط
    $_SESSION['destroyed'] = time();    

    // كتابة و إنهاء الجلسة الحالية
    session_commit();

    // إبدأ الجلسة بالمعرف  الجديد
    session_id($new_session_id);
    ini_set('session.use_strict_mode', 0);
    session_start();
    ini_set('session.use_strict_mode', 1);
    
    // الدالة لا تحتاج هذه المُتغيرات
    unset($_SESSION['destroyed']);
    unset($_SESSION['new_session_id']);
}
?>

سجل التغييرات

الإصدار الوصف
7.0.0 تحفظ الدالة session_regenerate_id()‎ بيانات الجلسة القديمة قبل إغلاقها.
5.1.0 أُضيف المُعامل delete_old_session.
4.3.3 في ذلك الإصدار وما قبل، إذا فعلت ملفات تعريف الارتباط (كوكيز) الخاصة بالجلسة، فإن استعمال الدالة session_regenerate_id()‎ سينجرّ عنه إنشاء ملف ارتباط جديد و معرف جديد.

انظر أيضًا

  • الدالة session_is_registered()‎: تتحقق من وجود (أو تسجيل) المتغير العام المُمرَّر إليها في الجلسة.
  • الدالة ()session_unregister: تقوم بفك تسجيل المتغير العام المُمرَّر إليها في الجلسة.

مصادر