背景:项目钱海支付thinkphp3.0版本,有一单1秒内提交了3次,查看日志发现都相差几毫秒,应该是表单重复提交引起的
解决方案:
由于项目使用是tp版本很早,支付表单没有使用表单令牌
后端处理增加表单令牌验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if($this->isPost()){ //thinkphp表单令牌验证,单业务使用(全局未开启) //验证表单令牌 if(!isset($_POST['__hash__']) || !isset($_SESSION['__hash__'])) { // 令牌数据无效 redirect('/customer/myorder.html'); } // 令牌验证 list($key,$value) = explode('_', $_POST['__hash__']); if($_SESSION['__hash__'][$key] == $value) { // 防止重复提交 unset($_SESSION['__hash__'][$key]); // 验证完成销毁session //验证成功,向下执行 }else{ unset($_SESSION['__hash__'][$key]); redirect('/customer/myorder.html'); } //业务逻辑 |
前端处理增加表单提交后按钮变灰不能点击
前端表单提交在通过钱海表单验证后增加
1 2 3 |
//input button按钮置灰 $(this).css("background","#CCC"); $(this).attr("disabled",true); |
1 2 3 |
//a标签按钮置灰 $(this).css("background","#CCC"); $(this).unbind('click'); |
通过上面验证代码,可以了解表单令牌的原理已经能清楚了
更多待涛哥总结…
转载请注明:PHP笔记 » ThinkPHP表单令牌防止表单重复提交