在未使用验证码的情况下阻止评论垃圾邮件
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="" />
然后你就可以在服务器端检查一下。
根据我的经验,1)和3)完全无效,因为MNY机器人表现得像普通用户就会议有关,而使用JavaScript实现基本功能是inacceptible。 – 2009-10-16 13:14:03
@michael:你的反JavaScript态度已经过时了。所有用户中有不到5%的JavaScript已停用。如果你把它关掉了,那就是你自己的错。此外,对这些人不要提交无脚本警告。 – 2009-10-16 14:44:15
JavaScript是未来病毒感染,僵尸网络以及垃圾邮件的头号来源。如果你不加选择地使用它,或者需要它来实现基本功能。那么你就是问题的一部分。 – 2009-10-16 14:52:21
禁止链接。没有链接,垃圾邮件就没用了。
[编辑]作为中间的方式,只允许链接到“好”的网站(通常是你自己的)。它们中只有少数,所以您可以根据用户的请求添加它们,或者在验证链接之前持有评论。当它很好时,添加它。
过了一段时间,您可以关闭此功能,并自动拒绝包含链接的评论,并等待用户投诉。
Akismet有一个API。 http://cesars.users.phpclasses.org/browse/package/4401.html
还有一个贝叶斯过滤器类(BSD的license以及) http://cesars.users.phpclasses.org/browse/package/4236.html
大多数机器人只需填写整个表格并传送给你:有人在为它写了一个包装类(BSD的license)在。一个简单的技巧就是创建一个你通常借助javascript隐藏的普通字段。在服务器端只需检查该字段是否已填充。如果是这样 - 那肯定是垃圾邮件。
借助CSS隐藏领域会更好......那么任何非JS用户都不会看到它。 – Kip 2009-10-16 13:32:05
在我的经验,目前最有效的方法是蜜罐输入字段,它们通过CSS(最好用几种不同的方法,如知名度做出对用户不可见:隐藏,设置大小为0像素,绝对定位在浏览器窗口之外);如果他们无论如何填充,你可以认为它是一个垃圾邮件。
This blog描述了一个相当复杂的方法,我尝试过自己(迄今为止已经100%成功),但我怀疑你可以通过跳过所有哈希字段名称并只添加一些简单蜜罐领域。
+1这也在我的博客上工作,主要是。每隔一段时间就会有一个垃圾邮件发送者提交*页面上的每个*表格,尽管... – Kip 2009-10-16 13:21:10
+1。很酷。我也喜欢时间限制的想法。如果一个“用户”在请求页面后74毫秒提交一条评论,那么你知道一些事情了。 – 2009-10-16 13:43:59
@Steve - 是的,但不幸的是,spambots太容易失败了。 – 2009-10-16 13:50:55
在我的博客上,我有一种妥协验证码:如果帖子中包含链接,我只使用验证码。我也使用蜜罐输入字段。到目前为止,这已经是几乎 100%有效。每隔一段时间,都会有一个垃圾邮件发送者向每个不包含链接的表单提交一些内容(通常是“nice site!”)。我只能假设这些人认为我会通过电子邮件发现他们是谁(使用只有我看到的电子邮件地址)。
另一种常见的方法是给用户一个简单的问题(“火是热还是冷?”“什么是2加7?”等)。这是一个小小的captcha- 像,但它更容易使用屏幕阅读器的视力障碍的用户。我认为必须有一个WordPress插件来做到这一点,因为我经常在WordPress博客上看到它。
由于很多人已经提出:使用蜂蜜罐输入字段。但还有两件事你需要做。 首先,随机输入字段的名称/ ID是蜜罐。在会话中存储有用字段的状态(以及用于对抗CSRF攻击的表单令牌)。例如,您可以通过这些字段获得:姓名,电子邮件,信息。在你的表格中,你将会得到 “token”,这是你的代币,“jzefkl46”是这个表格的名字,“ofdizhae”代表电子邮件,“45sd4s2”代表消息,“fgdfg5qsd4”代表蜂蜜罐。 在用户会话,你可以像
array("forms" => array("your-token-value" => array("jzefkl46" => "name", "ofdizhae" => "email", "45sd4s2" => "message", "fgdfg5qsd4" => honey"));
你一定要回来,当你得到你的表单数据重新关联。
第二件事,由于机器人有很多机会避免你的蜂蜜罐场(25%的机会),所以可以增加罐的数量。有10或20个,你给机器人增加了难度,同时在你的html中没有太多的开销。
根据我的经验,大多数spambots一味提交到页面上的第一个表单。几个提交给每一个表格。我没有注意到随机选择一个(虽然我确定有一些) – Kip 2009-10-16 13:43:03
当然,目前他们不随机挑选,因为没有很多人使用蜂蜜罐方法。但给它2年或3年,一些将。 让我们在尽可能的情况下领先一些机器人。 – Arkh 2009-10-16 13:51:09
我真的不明白多个表单与蜜罐有什么关系,但是我链接的博客文章描述了如何在不需要会话的情况下随机化字段名称*。然而,我怀疑这种额外的努力是浪费的:现在简单的机器人会使用非随机名字的蜜罐字段(或者有没有人有与此相矛盾的数据?),如果他们*变得更加复杂,分析词法页面结构并用它来决定填充哪些字段以及哪些字段需要跳过并不难。 – 2009-10-16 14:58:01
随着使用蜜罐字段,我们可以自动禁止IP(这不适用于动态IP),特别是机器人发布的任何链接。
我已经通过像一个简单的数学问题,减少垃圾邮件的约99%,在我的网站如下:
什么是2 + 4文本框]
用户将能够提交问题/评论如果他们回答“6”。
适用于我和类似解决方案的作品来自Coding Horror的Jeff Atwood!
结账的例子和想法
一些WP反垃圾邮件插件是有许多不错的防垃圾邮件,而无需使用验证码。
一些我建议:hashcash,nospamnx,typepad反垃圾邮件。 所有这些使用不同的方法阻止垃圾邮件,我用它们全部。 hashcash + nospamnx块几乎所有spambot。和键盘反垃圾邮件阻止大多数人类类型的垃圾邮件。
这些也都是好的:spambam,涡喷SpamFree,抗验证码,坏行为,httpbl等
也简单的.htaccess,阻止任何机器人直接的职位,并非来自自己的网站(检查引荐)
,或者干脆外包您的评论系统disqus和睡个好觉。
Sblam!类似于Akismet在一个开放源码的过滤器。
它使用朴素贝叶斯滤波,检查发送方的IP地址和链接在多个分布式黑名单,检查HTTP请求的正确性,并且使用JS的存在作为一个提示(但不要求)。
定期验证码是现在的垃圾邮件僵尸解。
考虑,而不是"text CAPTCHAs":逻辑或常识问题,如“什么是1 + 1?”或者“通用乳蛋白的白马是什么颜色?”问题甚至可以是静态的(每个尝试都有同样的问题)。
(Taken from http://matthewhutchinson.net/2010/4/21/actsastextcaptcha)
我想杰夫阿特伍德甚至用这样的确认在他的博客。 (纠正我,如果我错了)
一些资源:
这是简单的技巧来阻止垃圾邮件b ot或蛮力攻击而不使用captcha。
在你的形式将这个:
<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的。
你能解释我什么是$ SECRET_KEY?我认为你在时间有一个错字() nmsdvid 2014-02-22 08:36:49
并且你应该需要一个简单的验证码脚本:http://thephpcode.blogspot.com/2009/07/php-gd-creating-security-captcha-in-php.html – mauris 2009-10-16 13:09:13
@Mauris,非验证码,这就是验证码。 – Malfist 2009-10-16 13:26:12
im sober =)如果提问者需要它。 – mauris 2009-10-16 14:51:41