小编iso*_*hii的帖子

防止重复的表单提交

我提出了一种技术,通过返回/转发或刷新页面来防止重复表单提交.我想在这里讨论它,我已经测试了一个不在生产环境中的样本,你可以识别的缺陷是什么?

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

- 为每个表单生成表单ID,并将其用作表单中的隐藏字段:

$formid = microtime(true)*10000;
Run Code Online (Sandbox Code Playgroud)

- 表格提交:

  • 从数据验证

  • 计算表单字段数据的哈希值

    $allvals = '';
    foreach($_POST as $k=>$v){
        $allvals .= $v;
    }
    $formHash = sha1($allvals);
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过与先前保存的哈希进行比较来验证表单哈希.会话值通过$ formid变量绑定到每个表单.

    $allowAction = true;
    if(isset($_SESSION['formHash'][$_POST['formid']]) && ($_SESSION['formHash'][$_POST['formid']] == $formHash)){
         $allowAction = false;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果找不到表单哈希,则表示这是第一次提交表单或更改表单数据.
  • 如果保存了数据(例如,保存到数据库),请将表单哈希保存到会话中:

    $_SESSION['formHash'][$_POST['formid']] = $formHash;
    
    Run Code Online (Sandbox Code Playgroud)

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

php forms submit

12
推荐指数
1
解决办法
2万
查看次数

标签 统计

forms ×1

php ×1

submit ×1