使用令牌防止双表单提交

Jay*_*len 5 php

我试图通过添加令牌隐藏字段来阻止用户双重提交论坛.

所以这就是我到目前为止所做的事情(在论坛加载之前我有这个代码来创建一个以当前时间为值的令牌.

$token = time();
setcookie('formToken', $token, time() + 3600);
Run Code Online (Sandbox Code Playgroud)

在我的论坛中,我有一个像这样的隐藏输入

<form method="post" action="'.$PHP_SELF.'?action=update">
<input type="hidden" name="token" value="'.$token.'" />
<input type="submit" value="go" />
</form>
Run Code Online (Sandbox Code Playgroud)

现在在我的页面顶部$ action =="update"我有这个代码

if(isset($_POST)  &&  ($_POST['token'] != $_COOKIE['formToken'])){
    $error_list .= '<li>You can not submit this forum twise.</li>';
} 
Run Code Online (Sandbox Code Playgroud)

如果我点击F5刷新页面,它再次提交表单而不显示我的错误.

gd1*_*gd1 10

我强烈建议你避免你的系统:它没有经过深度测试,你会浪费时间调试它,它不会避免臭名昭着的"再次发送POSTDATA?" 浏览器的确认对话框,这让用户感到困惑.

我建议你使用PRG模式(Post/Redirect/Get),这也是由论坛实现的phpbb.

Post/Redirect/Get(PRG)是一种Web开发设计模式,可以防止一些重复的表单提交,为用户代理(用户)创建更直观的界面.PRG以可预测的方式实现书签和刷新按钮,不会创建重复的表单提交.

http://upload.wikimedia.org/wikipedia/commons/3/3c/PostRedirectGet_DoubleSubmitSolution.png

你的问题已经解决了,解决方案就在这里,只需要采取它 - 滚动你自己似乎是一个解决方案只会浪费你的时间.:)

  • 它会阻止"某些"重复是,但如果用户点击和重定向之间有任何延迟,这个"模式"在没有其他措施的情况下变得无用. (3认同)