我正在努力理解回答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(使用前将#替换为@)