سؤال

ما مدى تميز معرف جلسة php؟لقد حصلت على انطباع من العديد من الأشياء التي قرأتها بأنه لا ينبغي لي الاعتماد على مستخدمين لا يحصلان على نفس معرف الجلسة مطلقًا.أليس هو GUID؟

هل كانت مفيدة؟

المحلول

يمكن بالفعل تكرار Session_id، لكن الاحتمال منخفض جدًا.إذا كان لديك موقع ويب يتمتع بحركة مرور عادلة، فقد يحدث ذلك مرة واحدة في عمر موقع الويب الخاص بك، وسوف يزعج مستخدمًا واحدًا فقط لجلسة واحدة.

لا يستحق هذا الاهتمام إلا إذا كنت تتوقع إنشاء موقع ويب ذو حركة مرور عالية جدًا أو خدمة لصناعة البنوك.

نصائح أخرى

إنها ليست فريدة جدًا كما تم شحنها.في التكوين الافتراضي، يكون نتيجة تجزئة لأشياء مختلفة بما في ذلك نتيجة gettimeofday (وهي ليست فريدة تمامًا)، ولكن إذا كنت قلقًا، فيجب عليك تكوينها لاستخلاص بعض الإنتروبيا من /dev/urandom، مثل ذلك

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

ابحث عن "php_session_create_id" في الرمز للخوارزمية الفعلية التي يستخدمونها.

تم التعديل للإضافة:يوجد مولد أرقام عشوائية DFA مصنف بواسطة معرف المنتج، ممزوجًا بالوقت في usecs.إنها ليست شرط التفرد الراسخ خاصة من الناحية الأمنية.استخدم تكوين الإنتروبيا أعلاه.

تحديث:

اعتبارًا من PHP 5.4.0 Session.Entropy_file الافتراضيات إلى /dev /urandom أو /dev /arandom إذا كانت متوفرة.في PHP 5.3.0 ، يتم ترك هذا التوجيه فارغًا بشكل افتراضي. دليل PHP

إذا كنت تريد معرفة كيفية إنشاء PHP لمعرف الجلسة بشكل افتراضي، فراجع الكود المصدري الموجود على جيثب.من المؤكد أنها ليست عشوائية وتعتمد على التجزئة (الافتراضي:md5) من هذه المكونات (راجع السطر 310 من مقتطف الكود):

  1. عنوان IP من العميل
  2. الوقت الحالي
  3. PHP مولد التطابق الخطي - مولد أرقام عشوائية زائفة (PRNG)
  4. مصدر عشوائي خاص بنظام التشغيل - إذا كان نظام التشغيل يحتوي على مصدر عشوائي متاح (على سبيل المثال./ديف/urandom)

إذا كان نظام التشغيل يحتوي على مصدر عشوائي متاح، فإن قوة المعرف الذي تم إنشاؤه لغرض كونه معرف جلسة عالية (/dev/urandom والمصادر العشوائية الأخرى لنظام التشغيل هي (عادةً) PRNGs آمنة تشفيريًا).ومع ذلك، إذا لم يحدث ذلك فهو مرضي.

الهدف من إنشاء تعريف الجلسة هو:

  1. تقليل احتمالية إنشاء معرفين للجلسة بنفس القيمة
  2. جعل الأمر صعبًا للغاية من الناحية الحسابية لإنشاء مفاتيح عشوائية والضغط على مفتاح قيد الاستخدام.

يتم تحقيق ذلك من خلال نهج PHP في إنشاء الجلسة.

لا يمكنك ضمان التفرد على الإطلاق, ، لكن احتمالات ضرب نفس التجزئة مرتين منخفضة جدًا لدرجة أنه لا يستحق القلق بشكل عام.

يمكنك تثبيت وظيفة بديلة لإنشاء التجزئة إذا كنت تريد تخصيص طريقة إنشاء المعرف (وهو رقم 128 بت يتم إنشاؤه عبر MD5 افتراضيًا).يرى http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

لمزيد من المعلومات حول جلسات PHP، جرب هذه المقالة الممتازة http://shiflett.org/articles/the-truth-about-sessions والذي يرتبط أيضًا بمقالات أخرى حول تثبيت الجلسة واختطافها.

حجم الجلسة_id
افترض أن Seesion_id موزع بشكل موحد وحجمه = 128 بت.افترض أن كل شخص على هذا الكوكب يقوم بتسجيل الدخول مرة واحدة يوميًا بجلسة جديدة مستمرة لمدة 1000 عام.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46) 
                ≈ 1/2**46 

لذا فإن احتمال حدوث تصادم واحد أو أكثر هو أقل من واحد في 70 ألف مليار.ومن ثم يجب أن يكون حجم session_id الذي يبلغ 128 بت كبيرًا بدرجة كافية.كما هو مذكور في التعليقات الأخرى، قد يتحقق session_manager أيضًا من عدم وجود session_id الجديد بالفعل.

العشوائية
ولذلك فإن السؤال الكبير الذي أعتقده هو ما إذا كان معرف الجلسة قد تم إنشاؤه بعشوائية زائفة جيدة.لا يمكنك التأكد أبدًا من ذلك، لكنني أوصي باستخدام حل قياسي معروف ومستخدم بشكل متكرر لهذا الغرض (كما تفعل بالفعل على الأرجح).

حتى لو تم تجنب الاصطدامات عن طريق التحقق، فإن العشوائية وحجم session_id أمر مهم، بحيث لا يستطيع المتسللون إجراء التخمين المؤهل بطريقة أو بأخرى والعثور على session_id:s النشطة باحتمال كبير.

لم أجد تأكيدًا على هذا ولكن أعتقد أن PHP يتحقق مما إذا كان معرف الجلسة موجودًا بالفعل قبل إنشاء معرف بهذا المعرف.

مشكلة اختطاف الجلسة التي يثير قلق الأشخاص هي عندما يكتشف شخص ما معرف الجلسة لمستخدم نشط.يمكن منع ذلك بعدة طرق، لمزيد من المعلومات حول ذلك يمكنك الاطلاع عليه هذه الصفحة على php.net و هذه الورقة حول تثبيت الجلسة

لا، معرف الجلسة ليس معرفًا عامًا (GUID)، ولكن لا ينبغي أن يحصل مستخدمان على نفس معرف الجلسة كما تم تخزينهما على جانب الخادم.

<?php
session_start();
$_SESSION['username']="username";
?>

<!DOCTYPE html>
<html>
<head>
    <title>Update</title>
</head>
<body>

<table border="2">
    <tr>
        <th>Username</th>
        <th>Email</th>
        <th>Edit</th>
    </tr>
<?php
     $conn=mysqli_connect("localhost","root","","telephasic");
     $q2="select * from register where username = '".$_SESSION['username']."'";
     $run=mysqli_query($conn, $q2);
     while($row=mysqli_fetch_array($run))
     {
         $name=$row[1];
         $email=$row[2];
     ?>

    <tr>
        <td><?php echo $name; ?></td>
        <td><?php echo $email; ?></td>
        <td><a href="edit.php"> Edit </a></td>
    </tr>
 <?php } ?>
 </table> 
 </body>

إذا كان اسم المستخدم الخاص بك مختلفًا أو فريدًا، فيمكنك استخدام هذا الرمز للجلسة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top