防止 POST 数据重复提交
方法1
- 服务器下发表单时,在表单里附加一个毫秒时间戳或唯一ID
- 客户端JS在表单内,插入点按提交按钮的时间戳,以及浏览器的信息
- 服务器端收到表单时,对表单的内容做哈希签名并缓存
- 有些业务逻辑天生就是防重复的。例如订单的状态流转,一般都是单向、不重复且不可逆的。此时要充分利用业务逻辑,尽量在直接回弹不合法请求的同时,就把重复提交顺手一起干掉。
方法3
用隐藏域来做:
提交页面代码:
目标页面(后台处理页面)代码:
if($_SESSION[‘SUB’]==$_POST[‘sub_rand’]){echo ‘’; break;}else{$_SESSION[‘SUB’]=$_POST[‘sub_rand’];}
方法2
后端生成token,保存数据前验证
方法3
PHP生成表单时设置一个token隐藏域,提交后JS则可以辅助把提交按钮设为不可点击.
提交表单时进行验证,相同则写入数据库并生成新的token.
token生成算法,比如:
$token = sha1(uniqid(mt_rand(), true));
uniqid获取一个带前缀(mt_rand),末尾带熵(true),基于当前时间微秒数的唯一编号.mt_rand用于生成更好的随机数.