有哪些非验证码方法可以阻止我评论中的垃圾邮件?
18 回答
根据我的经验,目前最有效的方法是通过 CSS 使用户不可见的蜜罐输入字段(最好使用几种不同的方法,例如可见性:隐藏、设置大小为 0 像素以及绝对定位在浏览器窗口之外);如果它们被填满,你可以假设它是一个垃圾邮件机器人。
这篇博客描述了一种我自己尝试过的相当复杂的方法(到目前为止已经 100% 成功),但我怀疑您可以通过跳过所有带有散列字段名称的内容并添加一些简单的蜜罐字段来获得相同的结果。
1)在表单中添加会话相关信息示例:
<input type="hidden" name="sh" value="<?php echo dechex(crc32(session_id())); ?>" />
然后在回发时,检查会话是否有效。
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())) ?>';" />
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="" />
然后你可以在服务器端检查它。
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(); ?>" />
把它放在你的 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();
}
根据表格的重量,您可以增加或减少 $human_typing_time。
还有蜜罐理论。我喜欢将蜜罐与其他形式的垃圾邮件减少相结合,以获得最佳效果。
另一种常见的方法是给用户一个简单的问题(“火是热的还是冷的?”“什么是 2 加 7?”等)。它有点像验证码,但对于使用屏幕阅读器的视力障碍用户来说,它更易于访问。我认为必须有一个 WordPress 插件可以做到这一点,因为我经常在 WordPress 博客上看到它。
正如很多人已经提出的那样:使用蜜罐输入字段。但是,您还需要做另外两件事。首先,随机化哪个输入字段的名称/id是蜜罐。在会话中存储有用字段的状态(以及用于对抗 CSRF 攻击的表单令牌)。例如,您可以获取以下字段:姓名、电子邮件、消息。在您的表单中,您将有“token”,这是您的令牌,“jzefkl46”是此表单的名称,“ofdizhae”用于电子邮件,“45sd4s2”用于消息,“fgdfg5qsd4”用于蜜罐。在用户会话中,您可以拥有类似的东西
数组(“表格”=> 数组(“你的令牌值”=> 数组(“jzefkl46”=>“名称”, "ofdizhae" => "电子邮件", "45sd4s2" => "消息", "fgdfg5qsd4" => 亲爱的"));
当您获取表单数据时,您只需要重新关联它即可。
第二件事,因为机器人有很多机会避开你的蜜罐场(25% 的机会),所以要增加罐的数量。使用其中的 10 或 20 个,您会增加机器人的难度,同时不会在 html 中产生太多开销。
常规验证码现在可以被垃圾邮件机器人解决。
改为考虑“文本验证码”:一个逻辑或常识问题,例如“什么是 1 + 1?” 或者“卡士达将军的白马是什么颜色的?” 问题甚至可以是静态的(每次尝试都是相同的问题)。
(Taken from http://matthewhutchinson.net/2010/4/21/actsastextcaptcha )
我认为 Jeff Atwood 甚至在他的博客上使用了这样的验证。(如我错了请纠正我)
一些资源:
- 文本验证码网站和服务:http ://textcaptcha.com/demo
- 一个插件: http: //matthewhutchinson.net/2010/4/21/actsastextcaptcha
- 更多关于文本验证码的非工作代码:http ://www.thesamet.com/blog/2006/12/21/fighting-spam-on-phpbb-forums/
砰!是一个类似于 Akismet 的开源过滤器。
它使用朴素贝叶斯过滤,检查发送者的 IP 和多个分布式黑名单中的链接,检查 HTTP 请求的正确性,并使用 JS 的存在作为提示(但不是必需的)。
通过一个简单的数学问题,我减少了网站上大约 99% 的垃圾邮件,如下所示:
什么是 2+4 [文本框]
如果他们回答“6”,用户将能够提交问题/评论。
适用于我,类似的解决方案适用于 Coding Horror 的 Jeff Atwood!
禁止链接。没有链接,垃圾邮件毫无用处。
[编辑] 作为一种中间方式,只允许链接到“好”网站(通常是你自己的)。它们只有少数几个,因此您可以根据用户的要求添加它们,也可以在验证链接之前保留评论。当它很好时,添加它。
一段时间后,您可以将其关闭并自动拒绝带有链接的评论并等待用户投诉。
大多数机器人只需填写整个表格并将其发送给您。一个有效的简单技巧是创建一个通常在 javascript 的帮助下隐藏的普通字段。在服务器端只需检查此字段是否已填写。如果是这样 - 那么它肯定是垃圾邮件。
在我的博客上,我有一种妥协的验证码:如果帖子包含链接,我只使用验证码。我还使用蜜罐输入字段。到目前为止,这已经接近100% 有效。不时会有垃圾邮件发送者向每个不包含链接的表单提交一些内容(通常是“好网站!”之类的东西)。我只能假设这些人认为我会通过电子邮件向他们发送电子邮件以了解他们的身份(使用只有我看到的电子邮件地址)。
Akismet 是一个不错的选择,他们会检查您的帖子是否有垃圾邮件并且工作效率很高。你只需要加载他们的图书馆。 http://akismet.com/development/
查看一些 wp 反垃圾邮件插件以获取示例和想法
有很多不错的反垃圾邮件不使用验证码。
我会推荐一些:hashcash、nospamnx、typepad 反垃圾邮件。所有这些都使用不同的方法阻止垃圾邮件,我全部使用它们。hashcash+nospamnx 几乎可以阻止所有垃圾邮件。和打字板反垃圾邮件阻止大多数人工输入的垃圾邮件。
这些也是好的:spambam、wp-spamfree、anti-captcha、bad-behaviour、httpbl 等
也可以使用简单的 .htaccess 来阻止任何不是来自您自己网站的机器人直接 POST(检查引用者)
或者,只是将您的评论系统外包给 disqus 并睡个好觉。
除了使用蜜罐字段外,我们还可以自动禁止那里的 IP(这不适用于动态 IP),尤其是任何由机器人发回的链接。