提交表单时为什么会生成新令牌

时间:2018-07-30 17:38:24

标签: php session

我正在努力理解answer on 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 个答案:

答案 0 :(得分:3)

基于@FunkFortyNiner提供的链接,我想我已经知道了,希望我能正确理解。

会发生什么: 如果我们两次单击提交按钮,则$ _POST令牌将保持不变,但$ _SESSION令牌(在标题中定义)将更改。.

通过链接:here

  

表单令牌的设置具有第二安全功能。因为   PHP会话存储在服务器端,可以对照   POST表单令牌和存储在服务器上的表单令牌。   这样可以确保所发布的表单实际上是正确的表单   而不是第三方表格。这意味着它是我们的形式。支票是一张   简单的字符串比较。

当我们单击提交两次时,PHP将重新生成令牌两次(服务器端),但是表单本身保持不变(客户端尚未重新生成HTML标记)的形式)。

换句话说,PHP通过每个“提交”请求重新生成令牌,但是您的浏览器不会重新生成包含令牌的表单。