我们都知道旧的"禁用提交按钮"技巧,但处理多个提交服务器端的最佳方法是什么?我有一个应用程序,一个表单只发送一次绝对至关重要 - 它处理一张信用卡.我没有写出它现在是怎么回事,但作为一个快速解决方案我投入了禁用提交技术,但是一些不耐烦的用户已经被禁用了两次.
那么,有什么方法可以避免这种情况呢?我可以想到一些 - 我过去曾使用过一些 - 但我想看看是否有任何关于如何解决这个问题的"最佳实践".我正在使用PHP,但我对概念更感兴趣.
编辑:我知道令牌技术,这是我过去使用的,这个问题或多或少是为了看看我的方法是否与其他优秀的程序员使用的方法一致.
我提出了一种技术,通过返回/转发或刷新页面来防止重复表单提交.我想在这里讨论它,我已经测试了一个不在生产环境中的样本,你可以识别的缺陷是什么?
请注意,我很清楚使用表单令牌,它将保护您免受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/
我正在使用此代码上传多个文件.在上传过程中,上传和选择按钮被禁用但这只适用于客户端用户可以轻松修改代码并删除其禁用属性,所以我怎样才能在服务器端执行此操作因此,用户在禁用后单击上传按钮将无法多次提交表单.感谢任何帮助!
的index.php
<!DOCTYPE html>
<html>
<head>
<title>Multiple File Upload using Ajax</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
</head>
<body>
<div>
<form action="action.php" method="post" enctype="multipart/form- data" id="multiple-upload-form">
<input type="button" id="select-file-btn" value="Select Files" onclick="document.getElementById('files').click(); return false;" />
<input type="submit" id="file-upload-btn" name="file_upload_btn" value="Upload">
<input type="file" id="files" name="files[]" multiple="" style="visibility: hidden;">
<br><br>
<div class="file-bar">
<span class="file-bar-fill" id="file-bar-fill-id"><span class="file-bar-fill-text" id="file-bar-fill-text-id"></span></span>
</div>
<script type="text/javascript">
var app = app || {};
(function(o){
"use strict";
var ajax, getFormData, setProgress;
ajax = function(data){
var xmlhttp = new XMLHttpRequest(), uploaded; …Run Code Online (Sandbox Code Playgroud)