在不使用验证码的情况下阻止垃圾评论

ian*_*ian 50 php captcha spam

在我的评论中阻止垃圾邮件的一些非验证码方法是什么?

Mic*_*rdt 61

根据我的经验,目前最有效的方法是通过CSS对用户不可见的蜜罐输入字段(最好使用几种不同的方法,例如可见性:隐藏,设置大小为0像素,绝对定位远远超出浏览器窗口); 如果他们无论如何都被填满你可以认为它是一个spambot.

这个博客描述了一个我自己尝试过的相当复杂的方法(到目前为止已经100%成功),但我怀疑你可以通过使用散列字段名称跳过所有内容并只添加一些简单的蜜罐字段来获得相同的结果.

  • +1.很酷.我也喜欢时间限制的想法.如果"用户"在请求页面后74毫秒提交评论,那么您就知道了什么. (8认同)
  • "蜜罐"方法的最大缺陷 - 浏览器无论如何都可以自动填充这些字段.例如,如果启用了自动填充功能,Chrome会将您的电子邮件放入每个<input name ="email">. (4认同)
  • 请注意,使用此方法,您可能会错误地阻止浏览器不应用那种CSS的终端用户(即盲文阅读器) (4认同)

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)

然后你可以在服务器端检查它.

  • @Michael Borgwardt互联网是病毒感染,僵尸网络以及最终垃圾邮件的100%来源. (12认同)
  • @michael:你的反javascript态度已经过时了.只有不到5%的用户停用了他们的javascript.如果你已经把它关掉了,那么这是你自己的错.此外,只是向这些人提出无脚本警告他们无法提交. (11认同)
  • Javascript一直是病毒感染的第一来源,僵尸网络,最终是垃圾邮件.如果您不加选择地使用它,或者需要它用于基本功能.那你就是问题的一部分. (7认同)
  • 根据我的经验,1)和3)完全无效,因为就会话而言,mny机器人的行为与普通用户一样,并且需要JavaScript才能实现基本功能. (6认同)

eas*_*ent 9

Akismet有一个API.有人为此编写了一个包装类(BSD liscense):http://cesars.users.phpclasses.org/browse/package/4401.html

还有一个贝叶斯过滤器类(BSD Liscense) http://cesars.users.phpclasses.org/browse/package/4236.html


Sto*_*art 6

这是在不使用验证码的情况下阻止垃圾邮件机器人或暴力攻击的简单技巧.

把它放在你的表格中:

<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.

  • 你能解释一下$ secret_key是什么吗?我认为你有时间错误()<$ var [1]我认为它应该是$ vars. (3认同)

小智 5

也有蜜罐理论。我喜欢将蜜罐与其他减少垃圾邮件的方式结合使用,以达到最佳效果。

http://www.projecthoneypot.org/