为什么我们提交表单时会生成一个新的令牌

2024-04-29

我正在努力理解回答SO https://stackoverflow.com/questions/2133964/how-to-prevent-multiple-inserts-when-submitting-a-form-in-php/51598449#51598449。这是一个防止表单被处理两次的解决方案(如果有人连续点击“提交”按钮两次)。

它生成一个唯一的令牌并将其存储在表单中。因此,如果单击提交按钮两次,它将忽略重复的提交。

Code is

    // 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'] 在我们第二次单击提交按钮时发生变化。

感谢您的帮助


根据@FunkFortyNiner 提供的链接,我想我已经弄清楚了,希望我正确理解了这一点。

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

从链接:here https://www.phpro.org/tutorials/Preventing-Multiple-Submits.html

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

当我们点击提交twicePHP将重新生成令牌twice(服务器端),但表单本身保持不变(客户端尚未重新生成表单的 HTML 标记)。

换句话说,PHP 会在每次“提交”请求时重新生成令牌,但浏览器不会重新生成包含该令牌的表单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们提交表单时会生成一个新的令牌 的相关文章