我正在努力理解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']会更改。
谢谢您的帮助
答案 0 :(得分:3)
基于@FunkFortyNiner提供的链接,我想我已经知道了,希望我能正确理解。
会发生什么: 如果我们两次单击提交按钮,则$ _POST令牌将保持不变,但$ _SESSION令牌(在标题中定义)将更改。.
通过链接:here
表单令牌的设置具有第二安全功能。因为 PHP会话存储在服务器端,可以对照 POST表单令牌和存储在服务器上的表单令牌。 这样可以确保所发布的表单实际上是正确的表单 而不是第三方表格。这意味着它是我们的形式。支票是一张 简单的字符串比较。
当我们单击提交两次时,PHP将重新生成令牌两次(服务器端),但是表单本身保持不变(客户端尚未重新生成HTML标记)的形式)。
换句话说,PHP通过每个“提交”请求重新生成令牌,但是您的浏览器不会重新生成包含令牌的表单。