更好的蜜罐实现(表单反垃圾邮件)
Posted
技术标签:
【中文标题】更好的蜜罐实现(表单反垃圾邮件)【英文标题】:Better Honeypot Implementation (Form Anti-Spam) 【发布时间】:2016-07-13 15:33:45 【问题描述】:我们如何摆脱我们网站上的这些垃圾邮件机器人?
每个网站都会在某个时候成为spambots 的受害者。您的处理方式会影响您的客户,并且大多数解决方案会阻止某些人填写您的表单。
这就是蜜罐技术的用武之地。它允许您忽略垃圾邮件机器人,而不会强迫您的用户填写验证码或跳过其他环节来填写您的表单。
这篇文章纯粹是为了帮助其他人在他们的网站表单上实施蜜罐陷阱。
更新:
自从在我客户的所有网站上实施以下蜜罐后,我们已经成功阻止了 99.5%(数千次提交)的所有垃圾邮件。那是没有使用“高级”部分中提到的技术,这些技术很快就会实现。
【问题讨论】:
【参考方案1】:概念
通过在您的表单中添加一个只有垃圾邮件机器人才能看到的不可见字段,您可以诱骗他们透露他们是垃圾邮件机器人,而不是实际的最终用户。
html
<input type="checkbox" name="contact_me_by_fax_only" value="1" style="display:none !important" tabindex="-1" autocomplete="off">
这里有一个简单的复选框:
用 CSS 隐藏。 有一个不起眼但显然是假的名字。 具有相当于 0 的默认值。 无法通过自动完成填写 无法通过 Tab 键导航到。 (见tabindex)服务器端
在服务器端,我们要检查该值是否存在并且是否具有非 0 的值,如果存在则适当地处理它。 这包括记录尝试和所有提交的字段。
在 php 中它可能看起来像这样:
$honeypot = FALSE;
if (!empty($_REQUEST['contact_me_by_fax_only']) && (bool) $_REQUEST['contact_me_by_fax_only'] == TRUE)
$honeypot = TRUE;
log_spambot($_REQUEST);
# treat as spambot
else
# process as normal
后备
这是日志的来源。如果您的某个用户最终被标记为垃圾邮件,您的日志将帮助您恢复任何丢失的信息。它还可以让您研究在您的网站上运行的任何机器人,如果它们将来被修改以绕过您的蜜罐。
报告
许多服务允许您通过 API 或上传列表来报告已知的垃圾邮件 IP。 (例如CloudFlare)请报告您发现的所有垃圾邮件程序和垃圾邮件 IP,以帮助使互联网变得更安全。
高级
如果你真的需要打击更高级的垃圾邮件机器人,你可以做一些额外的事情:
纯粹使用 JS 而非纯 CSS 隐藏蜜罐字段 使用实际不使用的实际表单输入名称。 (例如“电话”或“网站”) 在蜜罐算法中包含表单验证。 (大多数最终用户只会弄错 1 或 2 个字段;垃圾邮件机器人通常会弄错大部分字段) 使用 CloudFlare 等自动阻止已知垃圾邮件 IP 的服务 有表单超时,并防止即时发布。 (在页面加载后 3 秒内提交的表单通常是垃圾邮件) 防止任何 IP 每秒发布一次以上。 更多想法请看这里:How to create a "Nuclear" honeypot to catch form spammers【讨论】:
"有一个相当于 0 的默认值",但是这个例子有 value="1" 吗?这是故意的吗? @edank 随之而来的是一些限制,例如,如果他们只查看不是display:none
、visibility: hidden
或opacity: 0
的字段,他们将找不到任何属于页面最初呈现时不在屏幕上(这非常很常见),更不用说大多数机器人甚至不获取 css/js 文件(当他们只关心 HTML @987654329 @ 元素)。因此,尽管他们可以尝试检测蜜罐的 css,但这根本不值得。检测“可见”内容实际上有很多复杂性,但我刚才所说的是最常见的原因。
既然你已经用 display:none (或 CSS)隐藏了它,tabindex=-1 不会变得多余吗? IE。隐藏的字段无论如何都不能被标签?我担心 tabindex=-1 会给机器人一个很好的简单方法来查找你的蜜罐字段是什么!
@DaviddCeFreitas -- 复选框值为“1”。但它只会在用户选中该框时提交该值。机器人将选中该框,php 会将“1”读取为布尔值 TRUE 并检测机器人。
将 css 更改为 display:none 可以被认为不是未来的证明 - 潜在的未来机器人将能够检测 css 内联。也许更好的选择是实现一个类名不明显的类并使用样式表。垃圾邮件机器人必须下载正确的表格,并“猜测”哪个类名应用于特定表单。或者,使用 javascript 来“隐藏”输入将使这更加面向未来 - 请参阅 yodarunamok 的实现。【参考方案2】:
我们发现,此处建议的细微(尽管简单)变化对我们的联系表单蜜罐的有效性产生了巨大影响。简而言之,将隐藏字段更改为文本输入,让机器人认为它是密码。像这样的:
<input type="text" name="a_password" style="display:none !important" tabindex="-1" autocomplete="off">
您会注意到,此模拟密码输入与复选框示例保持相同的基本准则。是的,文本输入(而不是实际的密码输入)似乎工作得很好。
这个看似很小的变化导致我们的垃圾邮件急剧下降。
【讨论】:
您能否详细说明为什么这样做更有效?期望他们仍然会填写吗?还是他们会认为这是一个密码字段而没有提交?为什么不使用密码字段与文本? @delime 该字段的重点是让机器人填写它,从而通知我们该请求是垃圾邮件。文本字段蜜罐的想法是让它对机器人有吸引力(密码字段就不那么吸引人了。)也就是说,因为我不知道机器人是如何编码的,所以我无法具体说明为什么它作品。如果您自己做一些测试,我会对您的发现感兴趣。 到目前为止,运行三个蜜罐,其中一个是 type="password" 版本,机器人将填满所有 3 个或一个都不填……所以在这一点上它们看起来是相等的。不过没有误报。【参考方案3】:一个真正强制不自动完成的建议:
将autocomplete="off"
更改为autocomplete="nope"
或autocomplete="false"
由于给定值不是有效值(autocomplete
的值只有on
或off
),浏览器将停止尝试填充该字段。
更多详情,How to Turn Off Form Autocompletion。
希望这会有所帮助。
SYA :)
【讨论】:
以上是关于更好的蜜罐实现(表单反垃圾邮件)的主要内容,如果未能解决你的问题,请参考以下文章
反垃圾邮件系统|基于Springboot+vue 实现反垃圾邮件系统
反垃圾邮件系统|基于Springboot+vue 实现反垃圾邮件系统