停止没有验证码的垃圾邮件

Posted

技术标签:

【中文标题】停止没有验证码的垃圾邮件【英文标题】:Stop spam without captcha 【发布时间】:2011-04-14 05:20:41 【问题描述】:

我想阻止垃圾邮件发送者使用我的网站。但我发现 CAPTCHA 很烦人。我说的不仅仅是“输入文本”类型,而是任何需要用户浪费时间来证明自己是人类的东西。

我可以在这里做什么?

【问题讨论】:

与Practical non-image based CAPTCHA approaches? 和***.com/q/111576/10080 完全相同。在那里查看我的答案(和其他人)。 【参考方案1】:

要求 javascript 发布数据可以阻止大量垃圾邮件机器人,同时不会干扰大多数用户。

你也可以使用一个漂亮的技巧:

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

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

【讨论】:

显示设置在外部的任何原因: @codingjoe 内联样式基本上总是一个坏主意,不管它们的用途如何。是的,垃圾邮件机器人很容易忽略具有display: none 内联样式的字段。 @GFoley83 +1 完全正确,而不仅仅是 内联样式。 只是为了测试,我使用了来自我每天收到大约 50 封垃圾邮件。甚至在 style.css input[name=email]: display:none; 中为 &lt;input name="email" id="email" type="text"&gt; 这样的多汁命名字段设置 并没有阻止机器人继续发送电子邮件,而在使用 position:absolute; left:-9000px; 之后 成功了。可能(出于同样的原因)也不是最好的,但它确实有效。只是分享我的发现。 这不也会过滤使用自动填写表单的人的邮件吗? 您可以使用属性 autocomplete="off" 禁用自动完成【参考方案2】:

我结合了一些目前看来相当成功的方法:

    提供一个名为 email 的输入字段并用 CSS 隐藏它 display: none。提交表单时检查此字段是否为 空的。机器人往往会用虚假的电子邮件地址填写此地址。

    提供另一个包含页面时间的隐藏输入字段 已加载。检查加载和提交页面之间的时间 填写表格所需的最短时间越大。我用 5 到 10 秒之间。

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

    最后,检查是否设置了 HTTP_USER_AGENT,机器人有时没有设置, 并且 HTTP_REFERER 是表单页面的 URL。机器人 有时只是 POST 到导致 HTTP_REFERER 的提交页面 成为别的东西。

我的大部分信息来自http://www.braemoor.co.uk/software/antispam.shtml 和http://www.nogbspam.com/。

【讨论】:

你的 (1.) 被证明是坏的! name="email" 是垃圾邮件机器人的一个很好的目标是正确的,但是 display:none; 没有用。相反,起作用的是:position: absolute; left:-9000;!只是分享。 email 字段不适用于 Chrome 的自动填充功能。也许叫它name 它会阻止一般的爬虫程序,它们只是在互联网上抓取垃圾邮件,但是,如果一个机器人程序是专门为攻击您的网站而设计的,这将无济于事。【参考方案3】:

集成Akismet API 以自动过滤用户的帖子。

【讨论】:

【参考方案4】:

如果您正在寻找 .NET 解决方案,Ajax Control Toolkit has a control named NoBot。

NoBot 是一种控件,它尝试提供类似于 CAPTCHA 的机器人/垃圾邮件防护,而无需任何用户交互。 NoBot 的好处是完全隐形。 NoBot 可能与博客/评论垃圾邮件存在问题且不需要 100% 有效性的低流量网站最为相关。

NoBot 采用了几种不同的反机器人技术:

强制客户端浏览器执行可配置的 JavaScript 计算并验证结果作为回发的一部分。 (例如:计算可能是一个简单的数字,或者也可能涉及 DOM,以进一步确保涉及浏览器) 在请求表单和可以回发表单之间实施可配置的延迟。 (例如:人类不太可能在两秒内完成表格) 对每单位时间每个 IP 地址的可接受请求数实施可配置限制。 (例如:人类不可能在一分钟内提交相同的表单超过五次)

更多讨论和演示在blogpost by Jacques-Louis Chereau on 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 验证的次数,因为如果您在网站上获得足够的活动,那么有效的人应该至少在某些时候输入有效数据!

【讨论】:

此外,一些垃圾邮件发送者在印度和中国使用廉价劳动力而不是机器人。【参考方案6】:

我意识到这是一篇相当老的帖子,但是,我遇到了一个有趣的解决方案,称为“蜜罐验证码”,它易于实现且不需要 javascript:

提供一个隐藏文本框!

大多数垃圾邮件机器人很乐意填写隐藏文本框,让您礼貌地忽略它们。 您的大多数用户甚至永远不会知道其中的区别。

为了防止使用屏幕阅读器的用户落入您的陷阱,只需在文本框上加上“如果您是人类,请留空”或类似内容的标签。

多田!非侵入式垃圾邮件拦截!这是文章:

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

【讨论】:

我认为现代垃圾邮件机器人可以识别隐藏的文本框。仅添加隐藏元素并不能满足我的经验。使用 jquery 或 Javascript 隐藏文本框对我有用,因为大多数机器人无法呈现 javascript。【参考方案7】:

由于很难 100% 避免它,我建议阅读 this IBM article 于 2 年前发布的标题为“Real Web 2.0:打击网络垃圾邮件”的文章,其中对访问者行为和控制工作流程进行了简洁明了的分析

网络垃圾邮件有多种形式,包括:

wiki 上的垃圾文章和遭到破坏的文章 评论博客上的垃圾邮件 论坛、问题跟踪器和其他讨论网站上的垃圾帖子 Referrer 垃圾邮件(当垃圾邮件网站假装将用户引荐到某个目标时) 列出推荐人的网站) 社交网络上的虚假用户条目

处理 Web 垃圾邮件非常困难,但是 Web 开发人员 忽视了他或她的垃圾邮件预防 危险。在这篇文章中,以及在 第二部分稍后来,我介绍 技术、技术和服务 打击各种网络垃圾邮件。

除了电子邮件之外,还链接了一个非常有趣的“...hashcash technique,用于减少 Wiki 等上的垃圾邮件。

【讨论】:

【参考方案8】:

一个人类可读的问题如何告诉用户输入他在名字字段中输入的值的第一个字母和姓氏字段的最后一个字母或类似的东西?

或者显示一些隐藏的字段,这些字段是用 JavaScript 填充的,带有诸如 referer 之类的值。检查这些字段与您之前存储在会话中的字段是否相等。 如果值为空,则用户没有 javascript。那么它就不是垃圾邮件了。但机器人至少会填写其中的一些。

【讨论】:

【参考方案9】:

您当然应该选择 Honeypot 或 BOTCHA 之一。

【讨论】:

删除了您的链接导致页面离线。

以上是关于停止没有验证码的垃圾邮件的主要内容,如果未能解决你的问题,请参考以下文章

可以做些啥来防止类似论坛的应用程序中的垃圾邮件?

如何在没有验证码或集中管理系统(例如 akismet)的情况下防止垃圾邮件

如何在没有验证码的情况下保护联系表格?

C# Discord Bot 编码:创建一个发送垃圾邮件的命令,然后用另一个命令停止

如何阻止机器人和垃圾邮件提交评论?

验证码的诞生