【问题标题】:How do I add Honey pot fields to my forms?如何将蜜罐字段添加到我的表单中?
【发布时间】:2012-02-11 00:53:29
【问题描述】:

我一直在阅读有关在我的表单中添加蜜罐字段以打击机器人/垃圾邮件的信息。唯一的问题是他们没有指南或任何关于从哪里开始的东西。许多网站说要创建一个只有垃圾邮件机器人才能填写的隐藏字段。但由于我是新手,不知道我会在我的应用程序中从哪里开始。谁能给我有关如何设置的建议?我正在尝试让我的设计注册页面使用蜜罐字段。

【问题讨论】:

  • 只需添加一个隐藏字段并在提交时检查它;我不确定是什么混乱。
  • “隐藏”表示在屏幕上不可见不是<input type="hidden">。更多类似 visiblity: hidden; 或任何其他类型的使输入不可见的 css 技巧。

标签: ruby-on-rails ruby-on-rails-3 devise honeypot


【解决方案1】:

蜜罐验证码背后的基本思想是,您有一个隐藏的(通过 CSS)字段,命名为“表单”或“电子邮件”或“内容”,(对于仅读取字段名称的机器人)看起来应该是填写。然后,当服务器查看提交时,确保这些隐藏字段为空白。如果不是,则将帖子标记为机器人。

Here's a well explained example(在 ASP 中有一些代码)和here's a Rails Gem that provides honeypot captchas.

我链接的那个Rails Gem 安装后看起来很容易使用:

  <% form_tag comments_path, :honeypot => true do -%>
  ...
  <% end -%>

尽管如果您有兴趣了解该方法,而不仅仅是实施它,我还是建议您自己动手。如果您自己滚动,请务必确保该字段被 CSS(或其他一些样式/定位技巧)而不是 input type="hidden" 隐藏,否则机器人可能不会填写该字段。

正如 Michael Mior 在 cmets 中指出的那样,重要的是在隐藏字段旁边有一条消息,告诉用户将其留空 - 否则使用屏幕阅读器的用户可能会错误地填写它。我的 gem 中缺少此功能链接到 - 因此,如果您正在制作一个可访问的网站(您几乎肯定应该这样做),您可能需要对其进行修改或自行开发。


请记住,这个技巧并非万无一失 - 没有什么可以阻止机器人呈现页面并在填写任何内容之前确定哪些字段对用户实际可见 - 但这种机器人会比一个复杂得多那只是看着表单html。蜜罐验证码在阻止简单机器人方面可能非常有效。

【讨论】:

  • 请注意,您引用的 gem 存在一些可访问性问题。有一条消息告诉用户将该字段留空,这一点很重要。这可以与表单字段一起隐藏,但它可以确保使用屏幕阅读器的人能够正确地将字段留空。
  • @MichaelMior 好点。我应该链接到更好的宝石吗?
  • 所以如果我要自己动手。我是先创建一个虚拟属性,然后是一个声明它应该留空的方法,然后用绝对定位 -9999 将其隐藏在屏幕之外?
  • 看看我的编辑,我想我只是遇到了一个问题。
  • include Rails.application.routes.url_helpers了吗?如果您仍然遇到问题,您可能需要打开另一个问题(因为新问题与原来的问题足够不同)。
【解决方案2】:

试试invisible_captcha(支持 Rails 3、4 和 5)。

它适用于中小型(就流量而言)网站,采用简单灵活的方法。它还提供对时间敏感的提交。

基本用法

在您的表单中:

<%= form_for(@topic) %>
  <%= invisible_captcha %>
  ...
<% end %>

在您的控制器中:

class TopicsController < ApplicationController
  invisible_captcha only: [:create, :update]
  ...
end

【讨论】:

    【解决方案3】:
    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,而不是内联样式。用标签通知用户是个好主意,而名称并不那么重要,因为大多数机器人通常会填写所有字段。

    如果与基本的数学验证码一起使用,肯定不是什么都可以,但非常有效。

    【讨论】:

      【解决方案4】:

      我现在将分享对我的网站 100% 有效的方法。

      近一周来,我们一直在测试防止大量被称为“垃圾邮件机器人”以及“暴力注册”的假用户成为假用户的方法。

      您可以在互联网上找到许多方法来应用所谓的蜜罐或注册表中的隐藏字段。

      这个技巧的目的是我们欺骗 FAKE REGISTRATION,因为它总是会在隐藏字段中填充数据,从而导致注册过程 DIE 防止虚假注册。

      现在我们提到了这个技巧的许多变体,可以在互联网上找到,我们将解释为什么我们的代码被引用为 100% 工作,因为现在它停止了所有垃圾邮件机器人和所有暴力注册。

      秘诀在于我们如何隐藏名称为“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。尝试注册将数据放在隐藏字段中,然后注册就死了,然后如果您从字段中删除数据,注册将继续。

      【讨论】:

        【解决方案5】:
        <div id="honeypotdiv">
        If you see this, leave it blank. Only bots should see this
        <input type="text" name="body" value="" />
        </div>
        

        【讨论】:

        • 这个答案出现在低质量审查队列中,大概是因为您没有解释代码。如果你确实解释了(在你的回答中),你更有可能获得更多的支持——提问者更有可能学到一些东西!
        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2013-07-29
        • 1970-01-01
        相关资源
        最近更新 更多