如何防止机器人自动填写表格?

时间:2010-03-05 14:44:06

标签: html-form spam

我正在努力想出一个足够好的反垃圾邮件机制来防止自动生成的输入。我读过像captcha,1 + 1 =等技术?这些东西运作良好,但是它们还会阻碍免费快速使用应用程序(我不会那样寻找类似的东西)。

我尝试使用display: none;在我的所有表单中设置一些隐藏字段 但是,我确定可以将脚本配置为跟踪表单字段ID,而不是填充它。

您是否实施/了解了良好的防自动填充机器人方法?有没有什么可以与HTML和/或服务器端处理无缝地完成,并且(几乎)防弹? (没有JS就可以简单地禁用它)。

我试图不依赖于会话(即计算点击按钮的次数以防止过载)。

28 个答案:

答案 0 :(得分:71)

一种易于实施但非万无一失(特别是“特定”攻击)解决反垃圾邮件的方法是跟踪表单提交和页面加载之间的时间。

Bots请求页面,解析页面并提交表单。这很快。

人类键入URL,加载页面,在页面完全加载前等待,向下滚动,阅读内容,决定评论/填写表单,需要时间填写表格,然后提交。

时间上的差异可能很微妙;如何在没有cookie的情况下跟踪这个时间需要某种方式的服务器端数据库。这可能会对性能产生影响 您还需要调整阈值时间。

答案 1 :(得分:71)

我实际上发现一个简单的Honey Pot字段效果很好。大多数机器人填写他们看到的每个表单字段,希望绕过必需的字段验证器。

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

如果你创建一个文本框,在javascript中隐藏它,然后验证服务器上的值是空白,这会消除99%的机器人,并且不会导致99%您的用户任何挫败感。其余1%禁用javascript的用户仍会看到文本框,但您可以为这些情况添加“将此字段留空”等消息(如果您完全关心它们)。

(另外,注意如果你在场上做了style =“display:none”,那么机器人很容易看到并放弃该字段,这就是为什么我更喜欢javascript方法)。

答案 2 :(得分:20)

如果 - Bot根本找不到任何form怎么办?

3个例子:

1。使用AJAX

插入表单

如果您对已禁用JS并且无法查看/提交表单的用户表示满意......您始终可以使用<noscript><p class="error">ERROR: The form could not be loaded. Please, re-enable JavaScript in your browser to fully enjoy our services.</p></noscript>通知他们。比,

  1. 创建form.html并将form放在<div id="formContainer">元素中。
  2. 在您需要调用该表单的页面内使用空<div id="dynamicForm"></div>和此jQuery:
  3. $("#dynamicForm").load("form.html #formContainer");
    

    2。使用JS

    完全构建表单

    // THE FORM
    var $form = $("<form/>", {
      appendTo : $("#formContainer"),
      class    : "myForm",
      submit   : AJAXSubmitForm
    });
    
    // EMAIL INPUT
    $("<input/>",{
      name        : "Email", // Needed for serialization
      placeholder : "Your Email",
      appendTo    : $form,
      on          : {        // Yes, the jQuery's on() Method 
        input : function() {
          console.log( this.value );
        }
      }
    });
    
    // MESSAGE TEXTAREA
    $("<textarea/>",{
      name        : "Message", // Needed for serialization
      placeholder : "Your message",
      appendTo    : $form
    });
    
    // SUBMIT BUTTON
    $("<input/>",{
      type        : "submit",
      value       : "Send",
      name        : "submit",
      appendTo    : $form
    });
    
    function AJAXSubmitForm(event) {
      event.preventDefault(); // Prevent Default Form Submission
      // do AJAX instead:
      var serializedData = $(this).serialize();
      alert( serializedData );
      $.ajax({
        url: '/mail.php',
        type: "POST",
        data: serializedData,
        success: function (data) {
          // log the data sent back from PHP
          console.log( data );
        }
      });
    }
    .myForm input,
    .myForm textarea{
      font: 14px/1 sans-serif;
      box-sizing: border-box;
      display:block;
      width:100%;
      padding: 8px;
      margin-bottom:12px;
    }
    .myForm textarea{
      resize: vertical;
      min-height: 120px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="formContainer"></div>

    3。 Bot-bait 输入

    机器人喜欢( 真的 之类的) saucy 输入元素,如:

    <input
      type="text"
      name="email"
      id="email"
      placeholder="Your email"
      autocomplete="nope"
      tabindex="-1" />
    

    他们很乐意像dsaZusil@kddGDHsj.com

    那样输入一些价值

    比(使用上面的HTML之后),使用CSS做:

    input[name=email]{ /* bait input */
        /*
             don't use display:none or visibility:hidden
             cause that will not fool the bot
        */
        position:absolute;
        left:-2000px;
    }
    

    现在您的输入对用户不可见,期望在PHP中$_POST["email"] 应为空(没有任何值)!否则请不要提交表格。

    现在,所有oyu需要做的是创建另一个输入,如<input name="sender" type="text" placeholder="Your email"> 之后(!) “bot-bait”输入实际用户的电子邮件地址。)

    致谢:

    Developer.Mozilla - Turning off form autocompletition
    StackOverflow - Ignore Tabindex

答案 3 :(得分:17)

我所做的是使用隐藏字段并在其上加上时间戳,然后使用PHP将其与服务器上的时间戳进行比较。

如果它超过15秒(取决于您的表格有多大或多小),那就是机器人。

希望这个帮助

答案 4 :(得分:15)

实际消除垃圾邮件的一种非常有效的方法是让文本字段中包含文本,例如“删除此文本以提交表单!”并且必须删除该文本才能提交表格。

在表单验证后,如果文本字段包含原始文本或任何随机文本,请不要提交表单。机器人可以阅读表单名称并自动填写姓名和电子邮件字段,但不知道他们是否必须从某个字段中删除文本才能提交。

我在公司网站上实施了这种方法,它完全消除了我们每天收到的垃圾邮件。它确实有效!

答案 5 :(得分:11)

如何创建与背景颜色相同的文本字段输入框,该框必须保持空白。这将解决机器人阅读显示的问题:无

答案 6 :(得分:8)

http://recaptcha.net/

reCAPTCHA是一项免费的抗菌服务,可帮助数字化书籍

谷歌(2009年)获得了它:

另见

答案 7 :(得分:6)

这些垃圾邮件机器人中的许多都只是服务器端脚本,它们使网络徘徊。您可以通过使用一些javascript在发送之前操纵表单请求来对抗其中的许多(即,根据某个客户端变量设置其他字段)。这不是一个完整的解决方案,并且可能导致许多问题(例如,没有javascript的用户,在移动设备上等),但它可能是您的攻击计划的一部分。

这是一个简单的例子......

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

你的php脚本中的某个地方......

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

此外,验证码很棒,而且确实是抵御垃圾邮件的最佳方法。

答案 8 :(得分:4)

我很惊讶没有人提到过这种方法:

  • 在您的页面上,包含一个隐藏的小图片。
  • 在提供此图片时放置一个Cookie。
  • 处理表单提交时,请检查cookie。


优点:

  • 方便用户和开发人员
  • 似乎很可靠
  • 没有JavaScript

缺点:

  • 添加一个HTTP请求
  • 要求在客户端启用Cookie


例如,WordPress插件Cookies for Comments使用此方法。

答案 9 :(得分:3)

随着无头浏览器(如phantomjs)的出现可以模仿任何东西,你不能假设:

  
      
  • 垃圾邮件机器人不使用javascript,
  •   
  • 您可以跟踪鼠标事件以检测bot,
  •   
  • 他们不会看到字段在视觉上被隐藏,
  •   
  • 他们不会在提交前等待一段时间。
  •   

如果过去是真的,则不再是真的。

如果你不是一个用户友好的解决方案,只是给他们一个漂亮的“我是垃圾邮件发送者”提交按钮

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

当然,您可以使用两个图像input[type=image]按钮,每次加载后更改顺序,文本替代,图像内容(及其大小)或按钮的name;这将需要一些服务器工作。

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

出于可访问性的原因,你必须提供正确的文本备选方案,但我认为对于屏幕阅读器用户而言,长句比被视为机器人更好。

答案 10 :(得分:2)

一种非常简单的方法是提供一些字段,例如<textarea style="display:none;" name="input"></textarea>,并丢弃所有填写此字段的回复。

另一种方法是使用Javascript生成整个表单(或只是字段名称);很少有机器人可以运行它。

无论如何,对于来自台湾或印度的现场“机器人”,你不会做太多的事情,每个链接支付0.03美元,并以此方式谋生。

答案 11 :(得分:2)

我有一个简单的方法来阻止垃圾邮件发送者100%有效,至少在我的经验中,并避免使用reCAPTCHA和类似的方法。一旦我实施了这种方法,我在我的网站的html表单中每天从接近100个垃圾邮件变为零,过去5年为零。

它的工作原理是利用大多数html表单处理脚本的电子邮件ALIAS功能(我使用FormMail.pl),以及图形提交“代码”,可以在最简单的图形程序中轻松创建。一个这样的图形包括代码M19P17nH和提示“请输入左边的代码”。

这个特殊的例子使用随机的字母和数字序列,但我倾向于使用我的访问者熟悉的非英语版本的单词(例如“pnofrtay”)。请注意,表单字段的提示内置于图形中,而不是显示在表单上。因此,对于一个机器人来说,那个形式领域并不表示其目的。

这里唯一真正的技巧是确保你的表单html将此代码分配给“recipient”变量。然后,在您的邮件程序中,确保您使用的每个此类代码都设置为电子邮件别名,该别名指向您要使用的任何电子邮件地址。由于表单上没有任何类型的提示供机器人阅读而没有电子邮件地址,因此它不知道在空白表单字段中放入什么。如果它在表单字段或除可接受代码之外的任何内容中没有放置任何内容,则表单提交将失败并显示“收件人错误”错误您可以在不同的表单上使用不同的图形,但在我的经验中并不是必需的。

当然,人类可以瞬间解决这个问题,没有与reCAPTCHA相关的所有问题以及类似的,更优雅的方案。如果人类垃圾邮件发送者确实响应了收件人故障并将图像代码编程到机器人中,那么一旦您意识到机器人已经硬编码以进行响应,您就可以轻松地进行更改。在使用这种方法的五年中,我从来没有使用过我使用它的任何形式的垃圾邮件,也没有从表格的任何人类用户那里得到过投诉。我确信这可以在机器人中使用OCR功能,但我从未在任何使用html表单的网站上发生过这种情况。我还使用了“垃圾邮件陷阱”(隐藏的“来这里”html代码,指向我的反垃圾邮件政策)效果很好,但它们的效率只有90%左右。

答案 12 :(得分:1)

我在这里想到很多事情:

  1. 使用JS(虽然你不想要)跟踪鼠标移动,按键,鼠标点击
  2. 获取推荐网址(在这种情况下应该是来自同一网域的网址)...普通用户必须在到达联系表单之前浏览网站:PHP: How to get referrer URL?
  3. 使用$ _SESSION变量获取IP并检查表单提交针对该IP列表
  4. 使用一些虚拟文本填写一个文本字段,如果已被覆盖,可以在服务器端检查
  5. 检查浏览器版本:http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ...很清楚机器人不会使用浏览器,只会使用脚本。
  6. 使用AJAX逐个发送字段并检查提交之间的时间差异
  7. 在表单之前/之后使用虚假页面,只是为了发送另一个输入

答案 13 :(得分:0)

我在表单中添加了时间检查。如果在不到3秒的时间内填写表格将不会提交,这对我来说非常有用,特别是对于长形式。这是我在提交按钮上调用的表单检查功能

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}

答案 14 :(得分:0)

您可以尝试欺骗垃圾邮件机器人,在Javascript验证后添加正确的操作属性。 因此,如果机器人阻止javascript,他们永远不会正确提交表单。

<强> HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

<强> JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

我添加一个&#34;回调&#34;在.attr()之后防止错误

答案 15 :(得分:0)

  1. 我使用的方法是隐藏文本框。由于机器人解析网站,他们可能会填写它。如果没有网站返回,我会检查它是否为空。

  2. 添加电子邮件验证。用户收到电子邮件,他需要单击链接。否则请在一段时间内丢弃该帖子。

答案 16 :(得分:0)

实际上, display:none 的陷阱就像魅力一样。它有助于将CSS声明移动到包含任何全局样式表的文件,这会强制垃圾邮件机器人加载它们(直接 style =“display:none;”声明可能会被解释为垃圾邮件机器人,文档本身内的本地样式声明也可以。)

这与其他对策相结合应该让任何垃圾邮件机器人都没有机会卸载他们的垃圾(我有一个用各种措施保护的留言簿,到目前为止他们已经为我的主要陷阱而堕落 - 但是,如果任何机器人绕过那些,还有其他人准备触发)。

我正在使用的是假表单字段的组合(如果使用的浏览器一般不处理CSS或特别是 display:none ),也会将其描述为无效字段,健全性检查(即输入的格式是否有效?),时间戳(提交时间太快和太慢),MySQL(用于实现基于电子邮件和IP地址的黑名单以及泛洪过滤器),DNSBLs(例如Spamhaus的SBL + XBL),文本分析(例如垃圾邮件的强烈表示)和验证电子邮件(以确定提供的电子邮件地址是否有效)。

关于验证邮件的一个注意事项:此步骤完全是可选的,但是当选择实现它时,此过程必须尽可能易于使用(也就是说,它应该归结为单击包含在其中的链接电子邮件)并使相关电子邮件地址在一段时间内列入白名单,以便在用户想要发布其他帖子时避免后续验证。

答案 17 :(得分:0)

随着越来越复杂的垃圾邮件机器人和自动浏览器等技术的出现,确定垃圾邮件的来源将变得更加困难。但是,无论是由软件,人类还是两者发布,垃圾邮件都是垃圾邮件,因为它的内容。我认为最好的解决方案是通过反垃圾邮件API(如Cleantalk或Akismet)运行发布的内容。它相对便宜和有效,并且不会给用户带来麻烦。在点击API之前,您可以检查表单提交时间和其他传统的不太复杂的机器人检查。

答案 18 :(得分:0)

抱歉,决定添加另一个答案。

我们结合使用以下两种方式:

  1. 带有name="email"的Honeypot字段(已经被其他答案提及)只需确保使用一种复杂的方式将其隐藏,例如从屏幕上移开之类。因为漫游器可以检测到display:none
  2. 当用户clicks(或focuses,如果希望成为TAB友好用户)在必填字段上时,JavaScript设置的隐藏字段(其他答案中未提及) li>

第二个选项甚至可以防止使用无头浏览器类型的垃圾邮件(使用phatnom.js或Selenium),因为即使JavaScript机器人也不会打扰实际单击文本框。

阻止99%的机器人。

PS。确保仅在密码管理器(例如LastPass或1Passwor)未填写的字段上使用焦点技巧。

出于相同的原因-用autocomplete="false" tabindex="-1"标记您的蜜罐

答案 19 :(得分:0)

使用 1)带有令牌的表格 2)检查表格以形成IP地址延迟 3)阻止IP(可选)

答案 20 :(得分:0)

根据我的经验,如果表格只是一个&#34;联系人&#34;形式你不需要特别的措施。垃圾邮件可以通过网络邮件服务得到体面的过滤(您可以通过服务器脚本跟踪网络表单请求,看看哪些内容有效地覆盖了您的电子邮件,当然我认为您有一个很好的网络邮件服务:D)

  

顺便说一句,我试图不依赖会话(比如,计算如何   很多时候点击一个按钮以防止过载。

我不认为这很好,我确实想要实现的是接收来自用户的电子邮件,这些电子邮件会执行某些特定操作,因为这些是我感兴趣的用户(例如用户)查看&#34; CV&#34;页面并使用正确的联系表格)。因此,如果用户做了我想要的事情,我会开始跟踪其会话并设置一个cookie(我总是设置会话cookie,但是当我不开始会话时,它只是一个伪造的cookie,让人相信用户有一个会话)。如果用户做了一些不需要的事情,我就不会为他保持一个会话,所以没有过载等等。

对我而言,广告服务提供某种api(可能已经存在),看看用户是否看过广告,这对我来说很不错,看广告的用户很可能是真正的用户,但如果他们不是真的很好,至少你得到1视图,所以没有任何损失。 (相信我,广告控制比你单独做的任何事情都要复杂)

答案 21 :(得分:0)

它只是一个想法,id在我的应用程序中使用并且运行良好

你可以用javascript或jquery在鼠标移动时创建一个cookie,在服务器端检查cookie是否存在,因为只有人类有鼠标,cookie只能由他们创建 cookie可以是时间戳或可以验证的令牌

答案 22 :(得分:0)

我发现这样做的简单方法是放置一个带有值的字段,并要求用户删除此字段中的文本。因为机器人只能填满它们。如果该字段不为空,则表示该用户不是人,也不会发布。它与验证码的目的相同。

答案 23 :(得分:0)

在JQuery网站上有一个tutorial。虽然它是JQuery,但这个想法与框架无关。

如果JavaScript不可用,那么您可能需要回退到CAPTCHA类型的方法。

答案 24 :(得分:0)

我发现避免被机器人发送垃圾邮件的最佳解决方案是在表单上使用一个非常简单的问题或字段。

尝试添加以下字段:

  • 将“你好”复制在方框中
  • 1 + 1 =?
  • 在框中复制网站名称

这些技巧要求用户理解必须在表单上输入的内容,从而使得成为大规模机器人表单填充的目标变得更加困难。

修改

正如您在问题中所述,此方法的背面是用户验证其表单的额外步骤。 但是,在我看来,它比验证码简单得多,填写表单时的开销不超过5秒,从用户的角度来看,这似乎是可以接受的。

答案 25 :(得分:0)

机器人无法执行JavaScript,因此您可以使用JavaScript将某种隐藏元素注入到页面中,然后在表单提交之前检测它的存在,但请注意,因为您的某些用户也会禁用JavaScript

否则我认为您将被迫使用客户证明“人性”的形式

答案 26 :(得分:0)

另一种选择,而不是像许多网站那样做随机字母和数字,是做可识别对象的随机图片。然后要求用户输入图片中的颜色或对象本身的颜色。

总而言之,每种解决方案都有其优点和缺点。您将不得不在用户通过反垃圾邮件机制和可以通过的垃圾邮件机器人数量之间找到一个愉快的中间值。

答案 27 :(得分:-1)

我只需要五美分。 如果这样做的目的是阻止99%的机器人听起来相当不错,并且如果99%的机器人无法运行Java脚本,那么击败所有机器人的最佳解决方案就是不使用具有提交帖子URL。

如果表单是通过java脚本控制的,并且java脚本收集表单数据然后通过HTTP请求发送,则没有机器人可以提交表单。由于提交按钮将使用Java脚本来运行发送表单的代码。