首先,我意识到还有其他问题与此类似,但它们并没有包含任何明确解决我问题的方法。
当客户提交订单时,我需要能够正确阻止我的处理脚本针对该特定订单多次运行。
/payment
- 客户填写所有详细信息并提交订单
/process_order
- 收集所有数据并处理订单。
发生的事情是我的订单正在被部分处理然后再次完全处理...我只能假设这是因为客户要么双击提交按钮,要么点击提交按钮一秒钟时间,因为该过程尚未完成,浏览器尚未重定向到“谢谢”页面......
我可以使用jQuery在第一次点击事件时禁用按钮,但我也想知道我可以在服务器端做什么来防止这种情况发生。
答案 0 :(得分:2)
一种可能的解决方案是为表单创建一个nonce令牌,并在显示表单时将其存储在会话中。
$_SESSION['formNonce'] = md5( time() . uniquid() );
生成表单时,将其添加为隐藏字段:
<input type="hidden" name="formNonce" value="<?php echo($_SESSION['formNonce']); ?>">
然后在处理它时,首先要做的是验证nonce是否在会话中,然后将其删除。这样,第二次提交将不会通过验证,因为已删除了nonce令牌。
所有这些都会有一些调整和错误检查,但加上javascript按钮禁用可能是一个可行的解决方案。
答案 1 :(得分:0)
例如,您可以使用“防伪tockens”方法。用户访问页面后,会分配一个tocken。首次尝试提交页面将从有效列表中删除tocken,以便进一步尝试失败。