Mic*_*rdt 61
根据我的经验,目前最有效的方法是通过CSS对用户不可见的蜜罐输入字段(最好使用几种不同的方法,例如可见性:隐藏,设置大小为0像素,绝对定位远远超出浏览器窗口); 如果他们无论如何都被填满你可以认为它是一个spambot.
这个博客描述了一个我自己尝试过的相当复杂的方法(到目前为止已经100%成功),但我怀疑你可以通过使用散列字段名称跳过所有内容并只添加一些简单的蜜罐字段来获得相同的结果.
mau*_*ris 14
1)将与会话相关的信息添加到表单中示例:
<input type="hidden" name="sh" value="<?php echo dechex(crc32(session_id())); ?>" />
Run Code Online (Sandbox Code Playgroud)
然后在回发时,检查会话是否有效.
2)仅限Javascript.在提交时使用Javascript注入.例:
<input type="hidden" id="txtKey" name="key" value="" />
<input type="submit" value="Go" onclick="document.getElementById('txtKey').value = '<?php echo dechex(crc32(session_id())) ?>';" />
Run Code Online (Sandbox Code Playgroud)
3)每个IP,用户或会话的时间限制.这很简单.
4)随机化字段名称:
<?php
$fieldkey = dechex(crc32(mt_rand().dechex(crc32(time()))));
$_SESSION['fieldkey'] = $fieldkey;
?>
<input type="text" name="name<?php echo $fieldkey; ?>" value="" />
<input type="text" name="address<?php echo $fieldkey; ?>" value="" />
Run Code Online (Sandbox Code Playgroud)
然后你可以在服务器端检查它.
Akismet有一个API.有人为此编写了一个包装类(BSD liscense):http://cesars.users.phpclasses.org/browse/package/4401.html
还有一个贝叶斯过滤器类(BSD Liscense) http://cesars.users.phpclasses.org/browse/package/4236.html
这是在不使用验证码的情况下阻止垃圾邮件机器人或暴力攻击的简单技巧.
把它放在你的表格中:
<input type="hidden" name="hash" value="<?php echo md5($secret_key.time()).','.time(); ?>" />
Run Code Online (Sandbox Code Playgroud)
把它放在你的PHP代码中
$human_typing_time = 5;/** page load (1s) + submit (1s) + typing time (3s) */
$vars = explode(',', $_POST['hash']);
if(md5($secret_key.$vars[1]) != $vars[0] || time() < $var[1] + $human_typing_time){
//bot?
exit();
}
Run Code Online (Sandbox Code Playgroud)
根据表格的重量,您可以增加或减少$ human_typing_time.