《PHP漏洞防范之防止表单重复提交有哪些常用方法?》要点:
本文介绍了PHP漏洞防范之防止表单重复提交有哪些常用方法?,希望对您有用。如果有疑问,可以联系我们。
相关主题:PHP安全
表单重复提交,主要是有这几种场景:
1、功击者在站外自己构造一个表单重复不断提交给您的网站。
2、用户提交表单时,刚好卡滞了,用户不明就里,尝试多次按下表单提交按钮,这时服务器已收到多次。但用户仍不知道。
3、功击者有意制造重复提交。
场景1主要且防跨站提交,不在这里讨论,参http://www.vephp.com/jiaocheng/61.html
后面2种有以下几种方法可以阻止。
1、使用JS让按钮在点击一次后禁用,即设置它的属性disabled="disabled"。这种方法可以防止多次点击的发生,实现方式较简单。
$('button[type=submit]').attr('disabled','disabled'); layer.msg('正在提交,请稍候......');
缺点是若客户端禁止JavaScript脚本,则失效。这个方法主要是防君子不防小人,因为功击者可以禁用JS。
2、表单隐藏域中存放token(表单被请求时生成的标记),同时,在session中也保存。等到用户提交表单后,进行比对。
采用此方法在接收表单数据后,检查此标志值是否存在,先进行删除,然后处理数据; 若不存在,说明已提交过,忽略本次提交。
缺点:使用SESSION很耗资源。
替代方案:使用缓存来保存token。
//1、服务端生成 $_SESSION['token'] = mt_rand(1000, 9999); //2、在表单页隐藏域存放此session值 <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"> //3、用户提交表单后处理 if($_POST['token'] != '' && $_POST['token'] == $_SESSION['token']) { unset($_SESSION['token']); //新提交,通过,存储数据 } else { echo '失败,已提交过表单'; }
最后,请记得:
在提交成功后执行页面重定向。转到提交成功信息页面。
原因:避免有意功击者F5重复提交,消除浏览器前进和后退按钮可导致的同样问题。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/64.html