لماذا يتم إنشاء رمز مميز جديد عند إرسال النموذج

1

أنا أكافح لفهم إجابة على SO . إنه حل يمنع معالجة النموذج مرتين (إذا نقر شخص ما على زر "إرسال" مرتين على التوالي).

يقوم بإنشاء رمز مميز فريد وتخزينه في النموذج. لذلك إذا تم النقر على زر الإرسال مرتين ، فسيتم تجاهل الإرسال المكرر.

الرمز هو

    // form.php
    <?php
        // obviously this can be anything you want, as long as it is unique
        $_SESSION['token'] = md5(session_id() . time());
    ?>
    <form action="foo.php" method="post">
        <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
        <input type="text" name="bar" />
        <input type="submit" value="Save" />
    </form>

    // foo.php
    if (isset($_SESSION['token']))
    {
        if (isset($_POST['token']))
        {
            if ($_POST['token'] != $_SESSION['token'])
            {
                // double submit
            }
        }
    }

يوافق الجميع على أنه الحل الصحيح ، لكنني لا أفهم لماذا يتغير $ _SESSION ['token'] في المرة الثانية التي نضغط فيها على زر الإرسال.

شكرا لك على مساعدتك

1 إجابة

2
افضل جواب

استنادًا إلى الرابط المقدم بواسطةFunkFortyNiner أعتقد أنني اكتشفت ذلك ، آمل أن أفهم ذلك بشكل صحيح.

ماذا يحدث: إذا نقرنا على زر الإرسال مرتين ، فسيظل الرمز المميز $ _POST كما هو ولكن سيتم تغيير الرمز المميز $ _SESSION (المحدد في الرأس) ..

من الرابط: هنا

The setting of a form token has a secondary security function. Because PHP sessions are stored server side, a check can be made against the POSTed form token and the form token which is stored on the server. This ensures that the form being POSTed is, in fact, the correct form and not a third party form. This means it is our form. The check is a simple string comparison.

عندما ننقر على إرسال مرتين ، سيقوم PHP بإعادة إنشاء الرمز المميز مرتين (جانب الخادم) ، لكن النموذج نفسه لا يزال كما هو (لم يقم العميل بإعادة إنشاء ترميز HTML للنموذج).

بمعنى آخر ، تقوم PHP بإعادة إنشاء الرمز المميز مع كل طلب "إرسال" ، ولكن متصفحك لا يقوم بإعادة إنشاء النموذج الذي يحتوي على الرمز المميز.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام