阻止评论垃圾邮件没有使用validation码
什么是一些非validation码的方法来阻止我的评论垃圾邮件?
根据我的经验,当前最有效的方法是通过CSS使用户不可见的蜜jarinput字段 (最好使用几种不同的方法,如visibility:hidden,设置0像素的大小,以及远离浏览器窗口的绝对定位)。 如果他们填充无论如何,你可以认为这是一个垃圾邮件。
这个博客描述了一个我自己尝试过的相当复杂的方法(迄今为止已经100%的成功),但是我猜测你可以通过跳过所有哈希字段名称并添加一些简单的蜜jar字段来获得相同的结果。
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。 有人在http://cesars.users.phpclasses.org/browse/package/4401.html上为它写了一个封装类(BSD liscense)
还有一个贝叶斯filter类(BSD Liscense) http://cesars.users.phpclasses.org/browse/package/4236.html
这是简单的技巧来阻止垃圾邮件机器人或蛮力攻击,而不使用validation码。
把它放在你的表单中:
<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(); }
取决于表单的权重,您可以增加或减less$ human_typing_time。
天真Beyesianfilter,当然:
http://blog.liip.ch/archive/2005/03/30/php-naive-bayesian-filter.html
还有蜜jar理论。 我喜欢将蜜jar与其他forms的垃圾邮件减less到最佳结果。
另一个常见的方法是给用户一个简单的问题(“火是热还是冷?”,“2加7是什么”等)。 这是一个小小的validation码,但对于使用屏幕阅读器的视力障碍用户来说更容易。 我认为必须有一个WordPress插件,因为我经常在WordPress博客上看到它。
Sblam! 是一个类似于Akismet的开源filter。
它使用朴素贝叶斯过滤,检查多个分布式黑名单中的发件人IP和链接,检查HTTP请求的正确性,并使用JS作为提示(但不是要求)。
普通的CAPTCHA现在可以解决垃圾邮件。
考虑“文本validation码” :一个逻辑或常识的问题,如“什么是1 + 1?” 或者“一般奶油的白马是什么颜色的?” 问题甚至可以是静态的(每个尝试都是同一个问题)。
(Taken from http://matthewhutchinson.net/2010/4/21/actsastextcaptcha )
我认为杰夫·阿特伍德甚至在他的博客上使用了这样的validation。 (如我错了请纠正我)
一些资源:
- 文本validation码网站和服务: http : //textcaptcha.com/demo
- 一个插件: http : //matthewhutchinson.net/2010/4/21/actsastextcaptcha
- 更多关于文字Captcha与非工作代码: http : //www.thesamet.com/blog/2006/12/21/fighting-spam-on-phpbb-forums/
你可以尝试使用像Akismet这样的第三方。 API密钥是免费供个人使用的。 另外,Zend Framework还有一个包 。
大多数机器人只是填写整个表格,并发送给你。 一个简单的技巧就是创build一个正常的字段,你通常使用javascript来隐藏。 在服务器端只检查这个字段是否被填充。 如果是这样 – 那么肯定是垃圾邮件。
很多人已经提出:使用蜂蜜jarinput字段。 但还有两件事情你需要做。 首先,随机input字段的名称/ id是蜜jar。 在会话中存储有用字段的状态(以及用于对抗CSRF攻击的表单标记)。 例如,你有这些领域得到:姓名,电子邮件,消息。 在你的表单中,你将会得到一个“token”,这个token是“jzefkl46”,这个名字是“jzefkl46”,email是“ofdizhae”,消息是“45sd4s2”,蜂蜜jar是“fgdfg5qsd4”。 在用户会话中,你可以有类似的东西
array(“forms”=> array(“your-token-value”=> array(“jzefkl46”=>“name”, “ofdizhae”=>“email”, “45sd4s2”=>“消息”, “fgdfg5qsd4”=> honey“));
当你得到你的表单数据时,你只需要重新关联它。
第二件事,因为机器人有很多机会避开你的蜂蜜jar(25%的几率),所以要把jar的数量增加一倍。 有10或20个,你增加了难度的机器人,而没有太多的开销在你的HTML。
禁止链接。 没有链接,垃圾邮件是没用的。
[编辑]作为一个中间的方式,只允许链接到“好”的网站(通常是你自己的)。 只有less数,所以你可以添加他们的请求你的用户或持有评论,直到你validation链接。 当它是好的,添加它。
过了一段时间,您可以closures此function,并自动拒绝包含链接的评论,并等待用户投诉。
我通过一个简单的math问题,在我的网站上减less了约99%的垃圾邮件,如下所示:
什么是2 + 4 [TextBox]
如果用户回答“6”,用户将能够提交问题/评论。
适合我和Coding Horror的Jeff Atwood的类似解决scheme!
在我的博客中,我有一种妥协的validation码:如果post中包含链接,我只使用validation码。 我也使用蜜jarinput字段。 到目前为止,这已经接近 100%有效。 每隔一段时间就会有一个垃圾邮件发送者向每个不包含链接的表单提交一些东西(通常是“好的网站!”)。 我只能假设这些人认为我会通过电子邮件发现他们是谁(只使用我看到的电子邮件地址)。
随着使用蜂蜜jar田,我们可以自动禁止IP(这不适用于dynamicIP),特别是机器人发布的任何链接。
Akismet是一个很好的select,他们检查您的post的垃圾邮件,并非常有效地工作。 你只需要加载他们的librabry。 http://akismet.com/development/
检查一些wp反垃圾邮件插件的例子和想法
没有使用validation码有很多很好的反垃圾邮件。
一些我会推荐:hashcash,nospamnx,键盘反垃圾邮件。 所有这些使用不同的方法阻止垃圾邮件,我用它们全部。 hashcash + nospamnx块几乎所有spambot。 和键盘反垃圾邮件阻止大多数人类types的垃圾邮件。
这些也是好的:spambam,wp-spamfree,反validation码,不良行为,httpbl等
也用简单的.htaccess阻止任何bot不直接来自你自己的网站(检查引用)
或者简单地将你的评论系统外包给disqus并睡觉。