php – 防止重复的表单提交

我想出了一种防止重复提交表单的技术,方法是返回/转发或刷新页面.而且我也想过这里,我已经测试了一个不在生产环境中的样品,你能识别出什么缺陷?

请注意,我很清楚使用表单令牌,这将保护您免受CSRF攻击,并没有在以下步骤中添加.

– 为每个表单生成表单ID,并将其用作以下形式的隐藏字段:

$formid = microtime(true)*10000;

– 表单提交:

>从数据验证
>计算表单域数据的哈希值

$allvals = '';
foreach($_POST as $k=>$v){
    $allvals .= $v;
}
$formHash = sha1($allvals);

>通过与先前保存的哈希进行比较来验证表单哈希.会话值通过$formid变量绑定到每个窗体.

$allowAction = true;
if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){
     $allowAction = false;
}

>如果没有找到表单哈希,这意味着这是第一次提交表单或更改表单数据.
>如果数据保存(例如数据库),将表单哈希保存到会话中:

$_SESSION['formHash'][$_POST['formid']] = $formHash;

完整版的代码
http://thebusy.me/2011/01/06/preventing-duplicate-form-submissions/

实现您想要的更简单的方法是在提交时使用重定向.处理POST请求后,您可以重定向到甚至是同一个页面.这是一种常见的模式,称为“POST POST后重定向”或 POST/Redirect/GET.

例如:

<?PHP
if($_POST) {
    // do something

    // Now redirect
    header("Location: " . $_SERVER["REQUEST_URI"]);
    exit;
}
?>

<html> ...
<form method="post" action=""> ... </form>

通过将操作设置为“”,则它将自动提交,此时if($_ POST)代码块将验证为true并处理该表单,然后重定向回自己.

当然,你可能想要重定向到另一个页面,显示“您的表单已提交”的响应或将表单放在不同的页面上,并使此页面的HTML成为响应.

这种方法的好处是当您点击后退按钮时,它会执行GET请求,因此表单不会被重新提交.

在Firefox上,它实际上会将浏览器历史记录自身提取出来,这样当用户浏览网页然后点击时,而不是看到“谢谢”页面,他们看到表单页面.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...