我一直在阅读有关在我的表单中添加蜜罐字段以打击机器人/垃圾邮件的信息。唯一的问题是他们没有指南或任何关于从哪里开始的东西。许多网站说要创建一个只有垃圾邮件机器人才能填写的隐藏字段。但由于我是新手,不知道我会在我的应用程序中从哪里开始。谁能给我有关如何设置的建议?我正在尝试让我的设计注册页面使用蜜罐字段。
5 回答
蜜罐验证码背后的基本思想是,您有一个隐藏的(通过 CSS)字段,名为“表单”或“电子邮件”或“内容”,(对于仅读取字段名称的机器人)看起来应该填写。然后,当服务器查看提交时,确保这些隐藏字段为空白。如果不是,那么您将帖子标记为机器人。
这是一个解释清楚的示例(在 ASP 中有一些代码),这是一个提供蜜罐验证码的 Rails Gem。
我链接的那个Rails Gem安装后看起来很容易使用:
<% form_tag comments_path, :honeypot => true do -%>
...
<% end -%>
尽管如果您有兴趣了解该方法而不仅仅是实现它,我建议您自己动手。如果您自己滚动,请务必确保该字段被 CSS(或其他一些样式/定位技巧)隐藏而不是input type="hidden"
- 否则机器人可能不会填写该字段。
正如 Michael Mior 在评论中指出的那样,重要的是在隐藏字段旁边有一条消息告诉用户将其留空 - 否则使用屏幕阅读器的用户可能会错误地填写它。我链接到的 gem 中缺少此功能 -因此,如果您正在制作一个可访问的网站(您几乎肯定应该这样做),您可能需要对其进行修改或自行开发。
请记住,这个技巧并不是万无一失的——没有什么能阻止机器人呈现页面并在填写任何内容之前确定用户实际可以看到哪些字段——但这种机器人会比看起来要复杂得多在表单 html 中。蜜罐验证码可能非常有效地阻止简单的机器人。
试试invisible_captcha(支持 Rails 3、4 和 5)。
它适用于中小型(就流量而言)网站,采用简单灵活的方法。它还提供对时间敏感的提交。
基本用法
在您的表格中:
<%= form_for(@topic) %>
<%= invisible_captcha %>
...
<% end %>
在您的控制器中:
class TopicsController < ApplicationController
invisible_captcha only: [:create, :update]
...
end
HTML -
<input type="text" name="verifyEmail" id="verifyEmail">
PHP Validation -
if(strlen($_POST['verifyEmail']) > 0){
header('location: {some redirect URL here..}'); //Send them way away from your form :)
die(); //Stop execution of the script
}
CSS -
#verifyEmail{
position:fixed;
visibility: hidden;
top:-500px; left:-500px;
}
dislplay: none;
不向 HTML 中的机器人显示(使用查看源代码尝试)
visibility: hidden; left:-500px; top:-500px;
(查看源代码时显示)
我使用了一段时间 display:none 蜜罐,然后当我想到源代码中没有显示该字段时切换到可见性选项。使用 CSS 中的类或 id,而不是内联样式。用标签通知用户是个好主意,而名称并不那么重要,因为大多数机器人通常会填写所有字段。
如果与基本的数学验证码一起使用,绝对不是一个陷阱,但非常有效。
我现在将分享对我的网站 100% 有效的方法。
近一周以来,我们一直在测试防止大量被称为“垃圾邮件机器人”以及“暴力注册”的假用户成为假用户的方法。
您可以在互联网上找到许多方法来应用所谓的蜜罐或注册表中的隐藏字段。
这个技巧的目的是我们欺骗 FAKE REGISTRATION,因为它总是会在隐藏字段中填充数据,从而导致注册过程 DIE 防止虚假注册。
现在我们提到可以在互联网上找到这个技巧的许多变体,我们将解释为什么我们的代码被引用为 100% 工作,因为现在它停止了所有垃圾邮件机器人和所有蛮力注册 2 天。
秘诀是我们如何隐藏名称为“field1”的字段,因为如果我们使用密码或邮政编码等通用名称,机器人会捕捉到。使用 field1 和 autocomplete = off 之类的名称会强制机器人填写该字段并阻止它确定该字段的用途,因此它将继续用数据填充它,从而终止注册尝试。
下图显示了我们在注册表单中使用的代码。
<input type="text" name="field1" style="display:none !important" tabindex="-1" autocomplete="off">
下图显示了我们放置在 PHP 表单中的代码,如果在字段中输入数据,该代码会处理终止注册的命令
if(!empty($_POST['field1'])) die();
在过去 48 小时内,此代码产生了零垃圾邮件机器人和零暴力注册。在 AFFA Social 享受我们所有人的乐趣
如果您想手动测试此代码,只需从上面的注册表单代码中删除style="display:none。尝试注册,将数据放在隐藏字段中,然后注册就死了,如果您从字段中删除数据,则注册将继续。
<div id="honeypotdiv">
If you see this, leave it blank. Only bots should see this
<input type="text" name="body" value="" />
</div>