سؤال

أنا مبتدئ يعمل على برنامج نصي تسجيل الدخول في PHP. هذا هو بيان رمز الشكل الذي لدي حتى الآن:

$_SESSION["form_token"] = md5(rand(time (), true)) ;

يتم إصدار البيان بعد أن يشير المستخدم مباشرة إلى أنه / هي يريد تسجيل الدخول.

فهمي المحدود هو أن الغرض من الرموز هو تحديد مستخدم فريد من نوعه في وقت فريد في الوقت المناسب وإخفاء معلومات رمزية النموذج.

ثم يصبح كل شيء غامض. فيما يلي أسئلتي الثلاثة المفتوحة:

  1. عندما يكون أفضل وقت "التحقق من" الرمز المميز للنموذج لأغراض الأمان؟

  2. كيف يمكنني التحقق من ذلك؟

  3. متى، إذا كنت أفعل "تدمير" رمز النموذج؟ (iow، هل سيبقى الرمز المميز "نشطا" حتى يسجل المستخدم؟

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

المحلول

ليست هناك حاجة للقيام بما تحاول. عند بدء تشغيل جلسة في PHP مع Session_Start () تم إنشاء جلسة فريدة من نوعها بالفعل لك. يجب ليس أن يضع هذا في النموذج. يتم التعامل معها عبر ملفات تعريف الارتباط بشكل افتراضي. ليس هناك حاجة أيضا للتحقق من الجلسة سواء، والتي يتم التعامل معها مرة أخرى بالنسبة لك.

أنت مسؤول عن مصادقة المستخدم وتخزين هويتها المصادق عليها (مثل $ _session ['user_id'] = userid $ في الجلسة. إذا قام المستخدم بتسجيل الخروج، فأنت تدمير الجلسة مع Session_destroy.

يجب عليك التأكد من أن الدورة_ستارت () هي واحدة من أول أشياء لجميع الصفحات في موقعك.

هنا مثال أساسي:

<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking

function login($username, $password)
{
    $user = new User();
    if ($user->login($username, $password)) {
        $_SESSION['user_id'] = $user->getId();
        return true;
    }
    return false;
}

function logout()
{
    session_destroy();
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']);
}

function generateFormHash($salt)
{
    $hash = md5(mt_rand(1,1000000) . $salt);
    $_SESSION['csrf_hash'] = $hash
    return $hash;
}

function isValidFormHash($hash)
{
    return $_SESSION['csrf_hash'] === $hash;
}

تحرير: أسيء فهم السؤال الأصلي. أضفت الأساليب ذات الصلة أعلاه لتوليد والتحقق من صحة النموذج

يرجى الاطلاع على الموارد التالية:

نصائح أخرى

هذا لمنع هجمات CSRF

http://en.wikipedia.org/wiki/cross-site_request_fovergery.

يمكن للموقع الضار أن يعرض نظريا نموذجا ينشر إلى طلبك. قد يحتوي النموذج على إرشادات تسبب خرق البيانات أو بعض الإجراءات غير المرغوب فيها. قد يخدع المستخدم في تقديم النموذج الذي سيقبله التطبيق لأن المستخدم قام بالفعل بتسجيل الدخول. يضمن الرمز المميز النموذج أن النموذج الذي تم إنشاؤه بواسطة موقعك وليس بعض الموقع الآخر.

غالبا ما يكون التحقق من http_referer جيدا بما فيه الكفاية، ولكن ليس كحل كامل (لن يقوم HTTPS على مثيل بإرسال سلسلة الإحالة).

إذا كنت ترغب حقا في تأمين جميع النماذج مع رمز رمزي، فيمكنك إنشاء بعض الوظائف الراحة مثل Emittoken () و CheckToken () التي ستجعلها على مستوى الموقع.

بعض الأمثلة:

http://ppsec.org/projects/guide/2.html.

http://www.rodsdot.com/php/csrf_form_protection.php.

يمكنك التحقق من تنفيذ zend الإطارية.

بصرف النظر عن التنفيذ المحدد، يصف المستندات التفكير والاستخدام لهذا النوع من العناصر في شكل.

zend_form_element_hash.https:/docs.zendframework.com/zend-form/element/csrf/

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