تحليل PHP لتقنية صفحة الويب الديناميكية على ملفات تعريف الارتباط والجلسات
الكاتب:Eve Cole
وقت التحديث:2009-06-06 18:16:01
1. PHP ملف تعريف الارتباط
ملف تعريف الارتباط هو آلية تقوم بتخزين البيانات على متصفح بعيد لتتبع المستخدمين وتحديد هويتهم.
ترسل PHP ملفات تعريف الارتباط في معلومات الرأس لبروتوكول http، لذلك يجب استدعاء وظيفة setcookie() قبل إخراج المعلومات الأخرى إلى المتصفح، وهو ما يشبه القيود المفروضة على وظيفة header().
1.1 تعيين ملفات تعريف الارتباط:
يمكن تعيين ملفات تعريف الارتباط باستخدام وظائف setcookie() أو setrawcookie(). ويمكن أيضًا ضبطه عن طريق إرسال رؤوس http مباشرة إلى العميل.
1.1.1 استخدم الدالة setcookie() لتعيين ملفات تعريف الارتباط:
مجموعة ملفات تعريف الارتباط المنطقية (اسم السلسلة [، قيمة السلسلة [، انتهاء صلاحية int [، مسار السلسلة [، مجال السلسلة [، bool Secure [، bool httponly]]]]]])
الاسم: اسم متغير ملف تعريف الارتباط
القيمة: قيمة متغير ملف تعريف الارتباط
انتهاء الصلاحية: الوقت الذي تنتهي فيه فترة الصلاحية،
المسار: دليل صالح،
المجال: اسم نطاق صالح، نطاق فريد من نوعه على المستوى الأعلى
آمن: إذا كانت القيمة 1، فإن ملف تعريف الارتباط يكون صالحًا فقط على اتصالات https، وإذا كانت القيمة الافتراضية هي 0، فإن كلاً من http وhttps صالحان.
مثال:
<?php
$value = 'شيء من مكان ما';
setcookie("TestCookie", $value); /* إعدادات ملفات تعريف الارتباط البسيطة*/;
setcookie("TestCookie", $value, time()+3600); /* فترة الصلاحية ساعة واحدة*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* دليل صالح/~rasmus واسم نطاق صالح example.com وجميع نطاقاته الفرعية */
?>
قم بتعيين متغيرات ملفات تعريف الارتباط المتعددة: setcookie('var[a]','value'); استخدم مصفوفة لتمثيل المتغير، لكن الحرف المنخفض الخاص بها لا يحتاج إلى علامات اقتباس. وبهذه الطريقة، يمكنك استخدام $_COOKIE['var'][. 'a'] لقراءة متغير ملف تعريف الارتباط.
1.1.2 استخدم header() لتعيين ملفات تعريف الارتباط.
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
المعلمات التالية هي نفس المعلمات المذكورة أعلاه لوظيفة setcookie.
على سبيل المثال:
$value = 'شيء من مكان ما';
header("Set-Cookie:name=$value");
1.2 قراءة ملفات تعريف الارتباط:
يمكنك استخدام المتغير الشامل المدمج في PHP $_COOKIE مباشرة لقراءة ملفات تعريف الارتباط على جانب المتصفح.
في المثال أعلاه، تم تعيين ملف تعريف الارتباط "TestCookie" والآن دعونا نقرأه:
طباعة $_COOKIE['TestCookie'];
هل تم تصدير ملف تعريف الارتباط؟!
1.3 حذف ملفات تعريف الارتباط
فقط قم بتعيين الوقت الصالح ليكون أقل من الوقت الحالي، وقم بتعيين القيمة على فارغة على سبيل المثال:
setcookie("name",time()-1);
يشبه استخدام الرأس ().
1.4 حل المشاكل الشائعة:
1) تظهر رسالة خطأ عند استخدام setcookie(). قد يكون ذلك بسبب وجود مخرجات أو مسافات قبل استدعاء setcookie(). وربما يكون المستند الخاص بك قد تم تحويله من مجموعات أحرف أخرى، وقد يحتوي المستند على توقيع BOM في النهاية (أي إضافته إلى محتوى الملف، بعض أحرف BOM المخفية). الحل هو منع حدوث هذا الموقف في مستندك. يمكنك أيضًا التعامل معه قليلاً باستخدام وظيفة ob_start().
2) يتأثر $_COOKIE بـ magic_quotes_gpc وقد يتم الهروب منه تلقائيًا
3) عند استخدامه، من الضروري اختبار ما إذا كان المستخدم يدعم ملفات تعريف الارتباط
<!--[if !supportLineBreakNewLine]-->
1.5 آلية عمل ملفات تعريف الارتباط:
بعض المتعلمين يكونون أكثر اندفاعًا وليس لديهم الوقت لدراسة المبادئ، لذلك أطرحها لاحقًا.
أ) يقوم الخادم بتعيين ملف تعريف الارتباط في العميل عن طريق إرسال رأس http Set-Cookie مع الاستجابة (تتطلب ملفات تعريف الارتباط المتعددة رؤوسًا متعددة).
ب) يرسل العميل تلقائيًا رأس ملف تعريف الارتباط http إلى الخادم، ويستقبله الخادم ويقرأه.
HTTP/1.x 200 موافق
مدعوم من X: PHP/5.2.1
Set-Cookie: TestCookie=شيء من مكان ما المسار=/
تنتهي: الخميس، 19 نوفمبر 2007، الساعة 18:52:00 بتوقيت جرينتش
التحكم في ذاكرة التخزين المؤقت: لا يوجد تخزين، لا يوجد ذاكرة تخزين مؤقت، يجب إعادة التحقق، التحقق اللاحق = 0، الفحص المسبق = 0
براغما: لا يوجد ذاكرة تخزين مؤقت
نوع المحتوى: نص/html
ينفذ هذا الخط وظيفة ملف تعريف الارتباط بعد استلام هذا الخط
Set-Cookie: TestCookie=شيء من مكان ما المسار=/
سيقوم المتصفح بإنشاء ملف تعريف الارتباط على قرص العميل ويكتب:
TestCookie=شيء من مكان ما؛
/
هذا السطر هو نتيجة استخدام setcookie('TestCookie','شيء من مكان ما','/');. وهو أيضًا نتيجة استخدام header('Set-Cookie: TestCookie=something fromwhere; path=/') ؛.
<!--[endif]-->
2. جلسة PHP
تستخدم الجلسة ملف تعريف ارتباط مع ضبط وقت انتهاء الصلاحية على 0، وتستخدم معرفًا فريدًا يسمى معرف الجلسة (سلسلة طويلة) لمزامنة بعض ملفات الجلسة على جانب الخادم (يمكنك تحديد نوع تخزين الجلسة بنفسك)، والتواصل مع المستخدم متصل. يقوم تطبيق الويب بتخزين البيانات المرتبطة بهذه الجلسات ويسمح بتمرير البيانات بين الصفحات مع المستخدم.
يتم تعيين معرف فريد لزوار موقع الويب، وهو ما يسمى بمعرف الجلسة. يتم تخزينه في ملف تعريف ارتباط من جانب العميل أو يتم تمريره عبر عنوان URL.
يتيح دعم الجلسة للمستخدمين تسجيل أي عدد من المتغيرات وحجزها لكل طلب. عندما يصل زائر إلى موقع الويب، تتحقق PHP مما إذا كان قد تم إرسال معرف جلسة معينة في الطلب، إما تلقائيًا (إذا تم تعيين session.auto_start على 1) أو عندما يطلبه المستخدم (يتم استدعاؤه بشكل صريح بواسطة session_start() أو ضمنيًا بواسطة session_register( )). إذا كان الأمر كذلك، فسيتم إعادة إنشاء البيئة المحفوظة مسبقًا.
2.1 نقل معرف الجلسة
2.1.1 إرسال معرف sessin من خلال ملف تعريف الارتباط
استخدم session_start() لاستدعاء الجلسة. أثناء إنشاء ملف الجلسة، يقوم الخادم بإنشاء قيمة تجزئة معرف الجلسة واسم الجلسة بالقيمة الافتراضية PHPSESSID، ويرسل المتغير إلى العميل (القيمة الافتراضية هي) PHPSESSID (اسم الجلسة). )، بالقيمة هي قيمة تجزئة 128 بت، وسيتفاعل الخادم مع العميل من خلال ملف تعريف الارتباط هذا.
يتم إجراء تسلسل لقيمة متغير الجلسة داخليًا بواسطة PHP وتخزينها في ملف نصي على جهاز الخادم، وتتفاعل مع وكيل العميل الذي يكون اسم متغيره PHPSESSID افتراضيًا.
أي أن الخادم يرسل تلقائيًا رأس http: header('Set-Cookie: session_name()=session_id(); path=/');
أي setcookie(session_name(),session_id());
عند الانتقال إلى صفحة جديدة من هذه الصفحة واستدعاء session_start()، ستتحقق PHP من بيانات الجلسة المخزنة على جانب الخادم والمرتبطة بالمعرف المحدد. إذا لم يتم العثور عليها، فسيتم إنشاء مجموعة بيانات جديدة.
2.1.2 إرسال معرف الجلسة عبر URL
يتم استخدام هذه الطريقة فقط عندما يحظر المستخدم استخدام ملفات تعريف الارتباط، لأن ملفات تعريف الارتباط للمتصفح عالمية بالفعل، ولأسباب أمنية، ليست هناك حاجة لهذه الطريقة.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>، يمكن أيضًا تمرير قيمة الجلسة من خلال POST.
2.2 أمثلة الاستخدام الأساسية للجلسة
<?php
//page1.php
session_start();
صدى "مرحبًا بك في الصفحة رقم 1"؛
/* إنشاء متغيرات الجلسة وتعيين قيم لمتغيرات الجلسة */
$_SESSION['favcolor'] = 'أخضر';
$_SESSION['animal'] = 'قطة';
$_SESSION['time'] = time();
// إذا كان العميل يستخدم ملفات تعريف الارتباط، فيمكن تمرير الجلسة مباشرة إلى page2.php
صدى '<br /><a href="page2.php">الصفحة 2</a>';
// إذا قام العميل بتعطيل ملفات تعريف الارتباط
echo '<br /><a href="page2.php?' . SID . '">الصفحة 2</a>';
/*
افتراضيًا، ضمن php5.2.1، سيكون لـ SID قيمة فقط عند كتابة ملف تعريف الارتباط في حالة الجلسة
ملف تعريف الارتباط المقابل موجود بالفعل، وسيكون معرف الأمان (SID) فارغًا (غير محدد).
*/
?>
<?php
//page2.php
session_start();
print $_SESSION['animal']; // اطبع جلسة واحدة
var_dump($_SESSION); // اطبع قيمة الجلسة التي تم تمريرها بواسطة page1.php
?>
2.3 استخدم وظيفة الجلسة للتحكم في التخزين المؤقت للصفحة.
في كثير من الحالات، نحتاج إلى تحديد ما إذا كانت صفحة الويب الخاصة بنا مخزنة مؤقتًا على العميل، أو تعيين وقت صلاحية ذاكرة التخزين المؤقت. على سبيل المثال، هناك بعض المحتوى الحساس على صفحة الويب الخاصة بنا وتحتاج إلى تسجيل الدخول لمشاهدته إذا تم تخزينه مؤقتًا محليًا يمكنك فتح ذاكرة التخزين المؤقت المحلية مباشرة، ويمكنك تصفح الويب دون تسجيل الدخول.
استخدم session_cache_limiter('private'); للتحكم في ذاكرة التخزين المؤقت لعميل الصفحة، والتي يجب استدعاؤها قبل session_start().
لمزيد من المعلمات، راجع التحكم في ذاكرة التخزين المؤقت للعميل على http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
للتحكم في وقت ذاكرة التخزين المؤقت للعميل، استخدم session_cache_expire(int Unit(s); ويجب أيضًا استدعاؤها قبل session_start().
هذه مجرد طريقة للتحكم في التخزين المؤقت عند استخدام الجلسة. يمكننا أيضًا التحكم في التخزين المؤقت للصفحة في الرأس ().
2.4 حذف الجلسة
يستغرق ثلاث خطوات لتحقيقه.
<?php
session_destroy(); // الخطوة الأولى: حذف ملف الجلسة من جانب الخادم
setcookie(session_name(),'',time()-3600); // الخطوة 2: حذف الجلسة الفعلية:
$_SESSION = array(); // الخطوة 3: حذف المصفوفة المتغيرة العامة $_SESSION
?>
2.5 استخدام الجلسة في تطبيقات الويب واسعة النطاق PHP بالنسبة للمواقع ذات عدد كبير من الزيارات، فإن طريقة تخزين الجلسة الافتراضية ليست مناسبة وظيفة bool session_set_save_handler (فتح رد الاتصال، إغلاق رد الاتصال، قراءة رد الاتصال، كتابة رد الاتصال، تدمير رد الاتصال، رد الاتصال gc) هي الحلول المقدمة لنا لحل هذه المشكلة.
الوظائف الستة التي تستخدمها هذه الوظيفة هي كما يلي:
1. يتم استخدام bool open() لفتح آلية تخزين الجلسة،
2.bool Close () يغلق عملية تخزين الجلسة.
3. mixde read () استخدم هذه الوظيفة عند تحميل بيانات الجلسة من التخزين
4. يكتب bool write() كافة بيانات معرف الجلسة المحدد للتخزين
5.bool Destroy () يدمر البيانات المرتبطة بمعرف الجلسة المحدد
6. bool gc() للحصول على مثال لجمع البيانات المهملة في نظام التخزين، راجع وظيفة session_set_save_handler() في دليل PHP.
إذا كنت تستخدم الفئات للتعامل معها، استخدم
session_set_save_handler(
صفيف ('اسم الفئة'،'فتح')،
صفيف ("اسم الفئة"، "إغلاق")،
صفيف ('اسم الفئة'،'قراءة')،
صفيف ('اسم الفئة'،'الكتابة')،
صفيف ("اسم الفئة"، "تدمير")،
صفيف ('اسم الفئة'،'GC')،
)
يمكن تغيير استدعاء الأساليب الثابتة الستة في فئة ClassName إلى كائن، لذلك ليست هناك حاجة لاستدعاء الأساليب الثابتة، ومع ذلك، فإن استخدام الأعضاء الثابتين لا يتطلب إنشاء كائن، ويكون الأداء أفضل.
2.6 وظائف الجلسة شائعة الاستخدام:
bool session_start(void);
bool session_destroy(void): حذف الملفات المرتبطة بجلسة الخادم.
معرف سلسلة session_id() للجلسة الحالية
string session_name() اسم الجلسة التي يتم الوصول إليها حاليًا، وهو اسم ملف تعريف الارتباط حيث يحفظ العميل معرف الجلسة الافتراضي هو PHPSESSID.
array session_get_cookie_params() تفاصيل الجلسة المرتبطة بهذه الجلسة.
تتحكم سلسلة session_cache_limiter() في ذاكرة التخزين المؤقت للعميل للصفحات التي تستخدم الجلسة
ini session_cache_expire() يتحكم في وقت ذاكرة التخزين المؤقت للعميل
bool session_destroy() يحذف الملف الذي يحفظ معلومات الجلسة على جانب الخادم
باطلة session_set_cookie_params ( عمر int [، مسار السلسلة [، مجال السلسلة [، bool Secure [، bool httponly]]]]) يضبط تفاصيل الجلسة المرتبطة بهذه الجلسة
bool session_set_save_handler (فتح رد الاتصال، إغلاق رد الاتصال، قراءة رد الاتصال، كتابة رد الاتصال، تدمير رد الاتصال، رد الاتصال gc) يحدد وظيفة معالجة الجلسة (لا تستخدم الطريقة الافتراضية)
bool session_regenerate_id([booldelete_old_session]) يعين معرف جلسة جديد
2.7 مشكلات أمان الجلسة يبذل المهاجمون جهدًا كبيرًا في محاولة الحصول على معرف الجلسة الفعال لمستخدم موجود، باستخدام معرف الجلسة، قد يكون بمقدورهم الحصول على نفس الإمكانيات التي يتمتع بها هذا المستخدم في النظام.
لذلك، الحل الرئيسي لدينا هو التحقق من صحة معرف الجلسة.
<?php
إذا(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* إذا كان معرف جلسة المستخدم مزورًا*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();