PHP漏洞防范之防止表单重复提交有哪些常用方法?

《PHP漏洞防范之防止表单重复提交有哪些常用方法?》要点:
本文介绍了PHP漏洞防范之防止表单重复提交有哪些常用方法?,希望对您有用。如果有疑问,可以联系我们。

表单重复提交,主要是有这几种场景:

1、功击者在站外自己构造一个表单重复不断提交给您的网站。

2、用户提交表单时,刚好卡滞了,用户不明就里,尝试多次按下表单提交按钮,这时服务器已收到多次。但用户仍不知道。

3、功击者有意制造重复提交。

场景1主要且防跨站提交,不在这里讨论,参http://www.jb51.cc/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重复提交,消除浏览器前进和后退按钮可导致的同样问题。

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。