我想出了一种防止重复提交表单的技术,方法是返回/转发或刷新页面.而且我也想过这里,我已经测试了一个不在生产环境中的样品,你能识别出什么缺陷?
请注意,我很清楚使用表单令牌,这将保护您免受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;