我一直在使用的一种防止表单滥用的技术是添加一个隐藏字段,该字段包含在服务器上设置的哈希变量。通过AJAX将表单提交到PHP脚本后,它将检查POST值与SESSION值生成的值。
在所有页面开头的包含文件中,我必须生成哈希值
$hashed_password = crypt($_SERVER['REMOTE_ADDR'],session_id());
$_SESSION['hashed_password'] = $hashed_password;
该表单是通过AJAX发送的,其中有代码;
if ($_SESSION['hashed_password'] !== $_POST['thisname']) {
// do stuff like show a message, record to a log, etc
die();
}
注意:此名称是表单上隐藏字段的名称。
这在99.9%的时间内效果很好。但是,有时它们不匹配。也不是垃圾邮件发送者,老顾客。似乎主要在Chrome上。
我不知道这怎么可能。在提交表单和提交表单之间更改了他们的IP地址?
有什么想法吗?
谢谢
答案 0 :(得分:0)
移动客户端经常更改其IP地址。
http协议是无状态的。不能保证任何两个请求都相互关联。
另一方面,您可以轻松地从单个IP接收完全不相关的请求。
答案 1 :(得分:0)
用户可能在多个选项卡中打开了您的应用程序。如果您在会话中始终只有一个哈希,则很可能会使用先前有效的哈希提交该哈希,而该哈希与会话中的当前哈希不匹配。我通过在会话上保留一系列生成的哈希值来处理此问题,每个哈希值都有一个时间戳,并在一段时间后使它们过期。