الفرق بين المراجعتين لصفحة: «PHP/session regenerate id»
رؤيا-بنعطية (نقاش | مساهمات) لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 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> === | ||
سواء قمت بحذف ملف الجلسة المرتبطة أم لا، يجب ألّا تمسح الجلسة القديمة إذا أردت تجنب أو كشف هجمات سرقة الجلسات. | |||
== القيم المعادة == | == القيم المعادة == | ||
تُعيد الدالة <code>session_regenerate_id()</code> القيمة <code>TRUE</code> في حالة | تُعيد الدالة <code>session_regenerate_id()</code> القيمة <code>TRUE</code> في حالة نجاحها، وإلاّ فستُعيد القيمة <code>FALSE</code>. | ||
== أمثلة == | == أمثلة == | ||
المثال 1:مثال | المثال 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>الوحدة البرمجية المستخدمة | |||
المثال 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 ضبط | ||
$_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>[[PHP/session is registered|session_is_registered()]]</code>: تتحقق من وجود (أو تسجيل) المتغير العام المُمرَّر إليها في الجلسة. | * الدالة <code>[[PHP/session is registered|session_is_registered()]]</code>: تتحقق من وجود (أو تسجيل) المتغير العام المُمرَّر إليها في الجلسة. | ||
* الدالة <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
: تقوم بفك تسجيل المتغير العام المُمرَّر إليها في الجلسة.