PHP防止用户重复提交表单

我们在项目中遇到提交表单的时候,用户重复提交表单是一个不可忽视问题,因为如果用户连续点击了提交按钮或者是攻击者恶意提交数据,我们在提交数据后的处理数据到数据库或者后续的使用时就会惹上麻烦。

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手:

前段限制

前端用js控制按钮在点击一次后disabled,还有就是在点击提交按钮之后,用遮罩层遮住页面,这样就简单有效防止了用户多次点击提交按钮,缺点是如果用户禁用了JavaScript脚本则失效。

页面重定向

我们可以在提交后做redirect页面重定向,即提交后跳转到新的页面,主要避免F5重复提交,但是在使用Ajax提交时就没有什么用处,也有很多。

数据库做唯一索引约束

数据库做唯一索引约束是有效的一种防止重复提交的方法,缺点也显而易见,更新的时候没有用处,用户体验也没那么友好。

session令牌验证

现在来了解下简单的利用session token来防止表单重复提交的方法,我们在表单中加一个input隐藏域,即type=”hidden”,其value值用来保存token值,当页面刷新的时候这个token值会变化,提交后判断token值是否正确,如果前台提交的token与后台不匹配,则认为是重复提交。

下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< ?php
/* * PHP简单利用token防止表单重复提交 */
session_start();
header("Content-Type: text/html;charset=utf-8");
//设置session token
function set_token() {
$_SESSION['token'] = md5(microtime(true));
}
//验证token
function valid_token() {
$return = $_REQUEST['token'] === $_SESSION['token'] ? true: false;
set_token();
return $return;
}
//如果token为空则生成一个token
if(!isset($_SESSION['token']) || $_SESSION['token']=='') {
set_token();
}
if(isset($_POST['web'])){
if(!valid_token()){
echo "token error,请不要重复提交!";
}else{
echo '成功提交,Value:'.$_POST['web'];
}
}else{
//todo
}
//end