【问题标题】:Preventing bot form submission防止机器人表单提交
【发布时间】:2013-02-25 12:41:52
【问题描述】:

我正在尝试找出一种防止机器人提交我的表单的好方法,同时保持流程简单。我已经阅读了几个很棒的想法,但我考虑在提交表单时添加一个确认选项。用户点击提交,会弹出 Javascript 确认提示,需要用户交互。

这会阻止机器人,还是机器人可以很容易地解决这个问题?下面是演示我的想法的代码和 JSFIddle:

JSFIDDLE

$('button').click(function () {
  if(Confirm()) {
    alert('Form submitted');
    /* perform a $.post() to php */
  }
  else {
    alert('Form not submitted');
  }
});

function Confirm() {
  var _question = confirm('Are you sure about this?');
  var _response = (_question) ? true : false;
  return _response;
}

【问题讨论】:

  • 如果机器人可以直接与服务器对话,那么 JavaScript 就无关紧要了——谁说它的行为就像人类一样?有隐藏字段、蜜罐隐藏字段、验证码等。但如果有人真的想向您的网站发送垃圾邮件,他们只会定制机器人(而且我确信不乏复杂的机器人垃圾邮件工具或可利用的低工资差异)。真正防止垃圾邮件的唯一方法是要求身份验证 - 以及处理垃圾邮件发送者的方法,例如阻止或限制帐户。
  • 在表单中使用验证码
  • 悬停时启用按钮,

标签: javascript jquery forms security spam


【解决方案1】:

这是很多人都遇到过的一个问题。正如用户 166390 在 cmets 中指出的那样,机器人可以绕过 javascript 直接向服务器提交信息(参见 cURLPostman 等简单实用程序)。现在,许多机器人都能够使用 javascript 并与之交互。 Hari krishnan 指出了captcha 的使用,其中(据我所知)最流行和最成功的是reCaptcha。但是验证码有他们的problems,并且被万维网纲要劝阻,主要是因为ineffectiveness and inaccessibility

为了避免我们忘记,攻击者总是可以部署人类智能来击败验证码。有攻击者付钱让人们破解验证码以发送垃圾邮件的故事,而工人却没有意识到他们正在参与非法活动。亚马逊提供了一项名为Mechanical Turk 的服务来解决此类问题。如果您将他们的服务用于恶意目的,亚马逊会强烈反对,它的缺点是需要花钱和创建书面记录。然而,还有更多的erhm提供者不会持有这样的反对意见。

那么你能做什么呢?

我最喜欢的机制是隐藏复选框。让它有一个标签,比如“您同意使用我们服务的条款和条件吗?”甚至可能带有一些严肃的术语的链接。但是您将其默认为未选中并通过 css 将其隐藏:将其放置在页面之外,将其放在零高度或零宽度的容器中,在其顶部放置一个具有更高 z-index 的 div。在这里推出你自己的机制并发挥创造力。

秘密在于没有人会看到复选框,但大多数机器人通过检查页面并直接操作来填写表单,而不是通过实际视觉。因此,任何带有该复选框值集的表单都可以让您知道它不是由人填写的。这种技术称为bot trap。自动表格填充机器人类型的经验法则是,如果人类必须通过调解来克服单个站点,那么他们就失去了通过传播他们的网站所能赚到的所有钱(以他们的时间形式)。垃圾广告。

(之前的经验法则假设您正在保护论坛或评论表单。如果实际资金或个人信息在线,那么您需要的安全性不仅仅是一种启发式方法。这仍然是security through obscurity,它只是事实证明,默默无闻足以保护您免受随意的脚本式攻击。不要自欺欺人地认为这可以保护您的网站免受所有攻击。)

另一半的秘密就是保守它。如果选中该框,请勿以任何方式更改响应。显示相同的确认,谢谢,或者之后的任何消息或页面。这将防止机器人知道它已被拒绝。

我也是计时方法的粉丝。您必须完全在服务器端实现它。跟踪以持久方式(基本上是会话)提供页面的时间,并将其与提交表单的时间进行比较。这可以防止伪造甚至让机器人知道它正在计时 - 如果您将服务时间作为表单或 javascript,然后您就让他们知道您正在使用它们,并邀请更复杂的方法。

同样,在提供相同的感谢页面时,只需默默地放弃请求(或者如果您想报复,则在响应垃圾邮件表单时引入延迟 - 这可能无法阻止他们压倒您的服务器,甚至可能通过保持更多连接打开更长时间,让它们更快地压倒您。此时,您需要硬件解决方案,负载平衡器设置上的防火墙)。

有很多关于延迟服务器响应以减缓攻击者的资源,通常以暴力密码尝试的形式出现。 This IT Security question 看起来是个不错的起点。

关于验证码的更新

我一直在考虑更新这个关于计算机视觉和表单提交主题的问题。最近出现的一篇文章将我指向计算机视觉爱好者this blog post by Steve Hickson。 Snapchat(显然是一些社交媒体平台?我从来没用过,感觉每天都变老了......)推出了一个新的类似验证码的系统,你必须识别包含鬼魂的图片(真的是卡通片)。 Steve 证明,这并不能验证提交者是否蹲下,因为在典型的情况下,计算机在识别这种简单类型的图像方面会更好更快。

不难想象将类似方法扩展到其他 Captcha 类型。我进行了搜索,发现这些链接也很有趣:

Is reCaptcha broken?
Practical, non-image based Captchas
If we know CAPTCHA can be beat, why are we still using them?
Is there a true alternative to using CAPTCHA images?
How a trio of Hackers brought Google's reCaptcha to its knees - 非常有趣,因为它是关于音频验证码的。

哦,如果没有强制性的XKCD comic,我们几乎是不完整的。

【讨论】:

  • 哇,感谢您提供的信息。我已经阅读了防止机器人的方法,并且大多数人建议使用 CAPTCHA,但最近我一直在读到人们说 CAPTCHA 在不久的将来不会出现。这给了我可以研究的信息,谢谢。
  • 我不会说他们不会在不久的将来出现。在我看来,它们有足够的缺点,以至于它们不再被广泛使用。有很多关于验证码的故事(或咆哮)让合法用户更难使用,甚至无法阻止 100% 的机器人流量。对于敏感的应用程序,一定程度的难度是可以接受的,但如果它是一个小型应用程序,或者特别是一个您从他们完成表单中获得的收益超过用户的应用程序(例如反馈或竞争激烈的商业模式),验证码可能会导致你的问题比他们解决的要多。
  • 在注册表的情况下,我也应该应用这个措施吗? Patrick M,请查看我的个人资料。
  • 一般来说,是的,您希望通过某种人工检测来保护每个输入表单。注册表通常需要电子邮件验证;不是为了检测机器人,而是为了验证您是否可以通过某种方式联系用户。如果它是电子邮件服务的注册,那么,请查看 gmail 在您创建新帐户时会做什么(并且他们在发送协议中内置了垃圾邮件检测)。如果要注册公共论坛,那么绝对要尽可能多地使用机器人检测,因为(根据我的经验)这会吸引大多数机器人寻找简单的垃圾邮件方法。
  • 我不是律师,这不是法律建议。即使您提供最大限度的机器人检测,您仍然可能违反任何数量的用户保护和隐私法律。
【解决方案2】:

今天我成功地阻止了我的表单的持续垃圾邮件。当然,这种方法可能并不总是有效,但它很简单,并且在这种特殊情况下效果很好。

我做了以下事情:

  • 我将表单的 action 属性设置为 mustusejavascript.asp,它只显示一条消息,表明提交无效,访问者必须启用 javascript。

  • 我将表单的 onsubmit 属性设置为一个 javascript 函数,该函数将表单的 action 属性设置为真正的接收页面,例如 receivemessage.asp

有问题的机器人显然不处理 javascript,所以我不再看到任何垃圾邮件。对于人类(打开了javascript)来说,它完全没有任何不便或额外的交互。如果访问者关闭了 javascript,他会在提交时收到明确的消息。

【讨论】:

    【解决方案3】:

    您的代码不会阻止机器人提交,但这不是因为您的代码如何。那里的典型机器人更有可能对 URL(action 属性)执行外部/自动 POST 请求。典型的机器人不会呈现 HTML、CSS 或 JavaScript。他们正在阅读 HTML 并对其进行操作,因此不会执行任何客户端逻辑。例如,卷曲 URL 将获得标记,而无需加载或评估任何 JavaScript。可以创建一个简单的脚本来查找<form>,然后使用匹配的键对该 URL 执行 CURL POST。

    考虑到这一点,防止机器人提交的服务器端解决方案是必要的。验证码 + CSRF 就足够了。 (http://en.wikipedia.org/wiki/Cross-site_request_forgery)

    【讨论】:

    • 谢谢你的信息。我从来没有意识到机器人实际上有多么复杂。我的想法是,如果用户必须进行交互,机器人将无法执行它的工作。我没有意识到机器人可以读取 Javascript 并确定 PHP 页面。像令牌这样的东西可以减少虚假帖子吗?
    【解决方案4】:

    不,你真的还在认为 Captcha 或 ReCap 是安全的吗?

    Bots nowDays 很聪明,可以使用 OCR 工具轻松识别图像上的字母(搜索即可理解)

    我说保护自己免受自动表单提交的最佳方法是在每次显示提交表单时添加一个隐藏的哈希生成(并存储在当前客户端的服务器上的会话中)!

    当 Bot 或任何 Zombie 提交表单时,您会检查给定的哈希是否等于会话存储的哈希;)

    了解更多信息阅读CSRF

    【讨论】:

    • CSRF 不会阻止机器人。它是为了别的,正如快捷方式提示的那样
    • 即使你想让机器人很难添加一些 Javascript 并使用 ajax 加载表单;)
    • 机器人可以执行 GET 以获取您的 CSRF 令牌,然后执行许多 POST,因为单个令牌对规范的多个请求有效。我的意思是,看看 DRM 保护,难度与你花在它上面的时间成正比(复杂性)。无论你在配方中加入什么秘密调味料,DRM 仍然被规避。
    • @matejkramny 是的,这很好,但我不遵循规范 :) 我在每个请求上更改令牌 :D,这是大多数其他网络应用程序所做的。 ;)
    【解决方案5】:

    您可以简单地将captcha 添加到您的表单中。由于验证码将是differentimages,机器人不能decode 那。这是所有网站中使用最广泛的安全措施之一...

    【讨论】:

    • 我过去使用过它们,但人们抱怨可读性。另外,我已经读过那些将被淘汰的文章。
    • @Mike 调查 reCaptcha。它很受欢迎。
    • @Mike 您可以将自己的图像制作为验证码。制作简单的图像,因为机器人无法识别不会出现问题的图像。
    【解决方案6】:

    您无法使用 javascript 实现您的目标。因为客户端可以解析您的 javascript 并绕过您的方法。您必须通过验证码在服务器端进行验证。主要思想是您在服务器端存储一个秘密,并使用服务器端的秘密验证从客户端提交的表单。

    【讨论】:

    • 只传递一个秘密是不行的;它需要以人类可以轻松解码的方式进行编码,但自动化脚本却不能。
    • 这就是验证码... :)
    【解决方案7】:

    您可以测量注册时间,无需在文本框中填写永恒!

    【讨论】:

    • 机器人可以轻松伪造填写表格所需的时间。机器人擅长等待。
    【解决方案8】:

    我遇到了阻止程序输入注册的表单输入验证。

    我最初的策略是抓取元素并将其设置为我想要的选项。我触发了对输入字段的关注并模拟了对每个元素的点击以显示下拉菜单,然后设置触发事件以更改值的值。但是当我尝试单击保存未注册为已更改的输入时。

        ;failed automation attempt because window doesnt register changes.
        ;$iUse = _IEGetObjById($nIE,"InternalUseOnly_id")
        ;_IEAction($iUse,"focus")        
        ;_IEAction($iUse,"click")
        ;_IEFormElementOptionSelect($iUse,1,1,"byIndex")
        ;$iEdit = _IEGetObjById($nIE,"canEdit_id")
        ;_IEAction($iEdit,"focus")
        ;_IEAction($iEdit,"click")
        ;_IEFormElementOptionSelect($iEdit,1,1,"byIndex")
        ;$iTalent = _IEGetObjById($nIE,"TalentReleaseFile_id")
        ;_IEAction($iTalent,"focus")
        ;_IEAction($iTalent,"click")
        ;_IEFormElementOptionSelect($iTalent,2,1,"byIndex")
        ;Sleep(1000)
        ;_IEAction(_IETagNameGetCollection($nIE,"button",1),"click")
    

    这让我重新思考如何通过直接操纵鼠标的动作来输入输入,以模拟更多具有鼠标类型行为的选择。不用说,我不必手动一张一张地上传图片来更新公司的产品图片。在字母前使用 Windows 编号将我的脚本放在目录末尾,当弹出图像上传窗口时,我必须使用主动可访问性从窗口获取 syslistview 并选择第二个元素,这是一张图片,第一个元素是一个文件夹.或 findfirstfile 中的第一个元素仅返回文件调用。我使用该名称在项目数据库中搜索项目,然后访问这些项目并在上传图像后更新一些属性,然后我将文件从该文件夹移动到另一个文件夹,这样它就不会再次被处理并且移动到列表中的下一个第一个文件并循环,直到在更新结束时找到脚本名称。

    只是分享一个卑微的数据输入人员如何节省时间,并与所有这些邪恶的表单验证检查作斗争。

    问候。

    【讨论】:

      【解决方案9】:

      这是一个非常短的版本,自从 4 年前在我的网站上实施以来一直没有失败,随着时间的推移,它会根据需要增加一些差异。这可以使用您需要的所有变量和 if else 语句构建

          function spamChk() {
          var ent1 = document.MyForm.Email.value
          var str1 = ent1.toLowerCase();
          if (str1.includes("noreply")) {
          document.MyForm.reset();
          }
      
      <input type="text" name="Email" oninput="spamChk()">
      

      我今天实际上是来了解如何将特定的垃圾邮件机器人 IP 地址重定向到 H E L L .. 只是为了好玩

      【讨论】:

        【解决方案10】:

        好主意。

        不久前,我删除了重新验证码,将我的 contactform.html 转换为 contactform.asp 并将其添加到顶部(显然,中间有一些代码来完整填写一些功能,如发送邮件、验证表单填写完整等。 )。

            <%
             if Request.Form("Text") = 8 then
                dothis
              else
                send them to google.com
             end if
           %>
        

        在表单上,​​我粘贴了一个带有名称 text 的基本文本字段,因此它看起来就像根本没有指定其用途的任何内容,然后我将一些文本粘贴在上面的 2 行红色中,说明输入什么 2 + 6 = 在下方的框以提交您的请求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多