停止垃圾邮件而不需要验证码。

25
我希望阻止垃圾邮件发送者使用我的网站。但我发现验证码非常烦人。我不仅仅是指“输入文本”类型的验证码,而是任何需要用户浪费时间证明自己是人类的方法。
在这种情况下,有什么可以做的呢?

请参考实用的非图像验证码方法?,以及https://dev59.com/nnVD5IYBdhLWcg3wBm5h。请查看那里的我的答案(和其他人的答案)。 - AviD
9个回答

23

要求使用JavaScript来提交数据可以有效防止大量垃圾邮件机器人的干扰,同时不会影响大多数用户。

你还可以使用一个巧妙的技巧:

<input type="text" id="not_human" name="name" />
<input type="text" name="actual_name" />
<style>
   #not_human { display: none }
</style>

大多数机器人会填充第一个字段,因此您可以阻止它们。


1
为什么将显示设置为外部设置呢? <input type="text" id="not_human" name="name" style="display: none" /> <- 这不是一个好主意吗?或者说,如果内联设置,机器人是否会检测到它? - codingjoe
2
@codingjoe,无论用途如何,内联样式基本上总是一个坏主意。是的,对于具有“display:none”内联样式的字段,垃圾邮件机器人很容易忽略它们。 - GFoley83
3
@GFoley83 +1,指的不仅是行内样式。我只是为了测试而使用了一个表单,结果每天收到了大约50封垃圾邮件。即使在style.css中设置input[name=email]: display:none;来隐藏一个名称精美的字段,如<input name="email" id="email" type="text">也无法阻止机器人继续发送电子邮件,但仅仅使用position:absolute; left:-9000px; 却可以解决问题。可能(出于相同的原因)并不是最好的,但它确实奏效了。只是分享我的发现。 - Roko C. Buljan
5
这难道不会过滤使用自动表单填充的人的邮件吗? - Klaasvaak
2
您可以使用属性autocomplete="off"禁用自动完成。 - David Canós
这将阻止一般网络爬虫进行垃圾邮件攻击,但是,如果有一个专门设计用来攻击您网站的机器人,这将无济于事。 - Abhishek Choudhary

20

我结合了几种方法,目前似乎非常成功:

  1. 提供一个输入字段,名称为email并使用CSS隐藏display: none。当提交表单时,检查此字段是否为空。机器人倾向于填写虚假的电子邮件地址。

  2. 提供另一个隐藏的输入字段,其中包含加载页面的时间。检查加载和提交页面之间的时间是否大于填写表单所需的最短时间。我使用5至10秒之间。

  3. 然后检查GET参数的数量是否符合您的预期。如果您的表单操作是POST,并且您的提交页面的基础URL是index.php?p=guestbook&sub=submit,那么您期望有2个GET参数。机器人会尝试添加GET参数,因此这个检查会失败。

  4. 最后,检查HTTP_USER_AGENT是否设置,机器人有时不设置,并且HTTP_REFERER是您表单页面的URL。机器人有时只是POST到提交页面,导致HTTP_REFERER变成其他内容。

我从http://www.braemoor.co.uk/software/antispam.shtmlhttp://www.nogbspam.com/获取了大部分信息。


11
你的 (1.) 是有问题的!name="email" 的确是垃圾邮件机器人的一个很好的目标,但是 display:none; 并没有起作用。相反,有效的方法是:position: absolute; left:-9000;!只是分享一下。 - Roko C. Buljan
“email”字段无法与Chrome的自动填充功能一起使用。也许可以将其称为“name”。 - Timofey Drozhzhin
这将阻止一般的网络爬虫来进行垃圾信息攻击,但是,如果有一个专门设计来攻击你的网站的机器人,这个方法就不起作用了。 - Abhishek Choudhary

15

6
如果您正在寻找.NET解决方案,Ajax控件工具包有一个名为NoBot的控件
NoBot是一种控件,试图提供类似CAPTCHA的机器人/垃圾邮件防止功能,而不需要任何用户交互。 NoBot的好处在于完全不可见。 NoBot可能最相关的是低流量站点,在这些站点上博客/评论垃圾邮件是一个问题,并且不需要100%的有效性。
NoBot采用了几种不同的反机器人技术:
- 强制客户端浏览器执行可配置的JavaScript计算,并将结果作为回发的一部分进行验证。(例如:计算可能是简单的数字计算,也可能涉及DOM以增加确保浏览器参与其中的保证) - 强制在请求表单和可以回发表单之间实施可配置的延迟。(例如:人类不太可能在两秒内完成表单) - 实施每个IP地址每单位时间可接受请求数量的可配置限制。(例如:人类不太可能在一分钟内提交相同的表单超过五次)

更多讨论和演示请参见 Jacques-Louis Chereau在NoBot上的博客文章

<ajaxToolkit:NoBot
  ID="NoBot2"
  runat="server"
  OnGenerateChallengeAndResponse="CustomChallengeResponse"
  ResponseMinimumDelaySeconds="2"
  CutoffWindowSeconds="60"
  CutoffMaximumInstances="5" />

5
我建议不要使用CSS或Javascript技巧来确保用户是真正的人类,因为这可能会引入可访问性问题、跨浏览器问题等。更不用说垃圾邮件机器人可以相当复杂,所以采用可爱的CSS显示技巧可能根本行不通。
我建议您考虑使用Akismet。
此外,您可以在验证用户数据方面有所创新。例如,假设您有一个需要用户电子邮件和地址的注册表单。您可以非常严格地验证电子邮件地址,甚至进一步确保该域名已经设置好接收邮件,并且该域名上有与提供的信息匹配的邮箱。您还可以使用Google Maps API尝试对地址进行地理定位并确保其有效。
为了进一步提高验证的准确性,您可以实施“硬”和“软”验证错误。如果邮件地址不符合正则表达式验证字符串,则是一个“硬”失败。无法检查域名的DNS记录以确保它接受邮件或者邮箱是否存在,则是一个“软”失败。当您遇到软失败时,您可以要求进行CAPTCHA验证。这样做希望能够减少需要进行CAPTCHA验证的次数,因为如果网站上有足够的活动,有效的人应该至少有一部分时间输入有效的数据!

4
此外,一些垃圾邮件发送者正在使用印度和中国的廉价劳动力而不是机器人。 - Donal Fellows

1
我意识到这是一个相当古老的帖子,然而,我发现了一个有趣的解决方案,称为“蜜罐验证码”,它易于实现且不需要JavaScript: 提供一个隐藏的文本框! - 大多数垃圾邮件机器人会很高兴地完成隐藏的文本框,从而让您礼貌地忽略它们。 - 您的大多数用户甚至不会注意到任何区别。
为了防止使用屏幕阅读器的用户陷入陷阱,请简单标记文本框为“如果您是人类,请留空”或类似内容。
哒哒声!非侵入式的垃圾邮件拦截!这是文章链接:

http://www.campaignmonitor.com/blog/post/3817/stopping-spambots-with-two-simple-captcha-alternatives


我认为现代垃圾邮件机器人可以识别隐藏的文本框。仅添加隐藏元素并不能解决我的问题。使用jQuery或JavaScript隐藏文本框对我有效,因为大多数机器人无法渲染JavaScript。 - Rashod Chamikara Bandara

0

由于完全避免它是极其困难的,我建议阅读两年前发布的IBM文章this IBM article,标题为“真正的Web 2.0:与Web垃圾作斗争”,其中分析了访问者行为和控制工作流程。

Web垃圾有很多形式,包括:

  • 维基百科上的垃圾文章和被破坏的文章
  • 博客上的评论垃圾
  • 论坛、问题跟踪器和其他讨论网站上的垃圾帖子
  • 引荐垃圾(当垃圾站点假装将用户引荐到列出引荐者的目标站点时)
  • 社交网络上的虚假用户条目

处理Web垃圾非常困难,但是Web开发人员如果忽略垃圾邮件预防,则会面临风险。在本文中,以及稍后即将发布的第二部分中,我介绍了对抗各种Web垃圾的技术、技术和服务。

此外,还链接了一个非常有趣的"...哈希现金技术,用于在维基和电子邮件等方面最小化垃圾邮件。"


0

你应该选择一个,Honeypot 或 BOTCHA。


1
由于页面已下线,我们已删除了您的链接。 - Roko C. Buljan

0

可以考虑使用一些人类可读的问题,提示用户输入名字字段的首字母和姓氏字段的尾字母等信息。

或者通过 JavaScript 填充一些隐藏字段,例如 referer 等值,并检查这些字段与会话中存储的字段是否相等。 如果这些值为空,则说明用户没有启用 JavaScript。那么这就不是垃圾邮件。但是机器人至少会填写其中一些字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接