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

Gal*_*Gal 102 forms spam

我正在尝试提出一个足够好的反垃圾邮件机制来防止自动生成的输入.我读过像captcha,1 + 1 =等技术?东西工作得很好,但他们也提出了一个额外的步骤阻碍了应用程序的免费快速使用(我不是在寻找类似的东西).

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

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

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

Ben*_*man 73

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

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

如果您创建一个文本框,把它藏在JavaScript,然后验证值是空白的服务器上,这会淘汰机器人的99%在那里,并不会引起用户的99%,任何挫折都没有.剩下1%的javascript已禁用仍会看到文本框,但您可以为这些情况添加"将此字段留空"等消息(如果您完全关心它们).

(另外,如果你在场上做了style ="display:none",那么对于机器人来说太容易看到并放弃该字段,这就是我更喜欢javascript方法的原因).

  • 小点在这里:为了解决JS问题,只需使用CSS将蜜罐输入*置于*页面顶部以上 - 这样就可以将js禁用,并绕过它,机器人将必须能够解析CSS绝对定位,并就是否是蜜罐做出常识决定.这样一点防弹:) (25认同)
  • @ alexy13是的,它更简单,但正如答案中所述,机器人更容易弄清楚你想要做什么,只测试一个CSS属性.但是,如果您使用绝对定位策略,机器人必须解析所有定位规则*和*大多数元素父母的规则,以便能够确定输入是否可见,然后图是否对这些信息采取行动 - 这对于大多数(如果不是全部)机器人来说都比它的价值更大. (3认同)
  • 我现在已经在两个受到抨击的站点上使用了此技术,并且两个站点的机器人注册现在都为零。它无助于针对性攻击,但是大多数人只是在寻找漏洞利用或垃圾邮件。 (2认同)

Pin*_*juh 71

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

机器人请求页面,解析页面并提交表单.这很快.

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

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

  • 注意是否要允许最终用户使用自动表单填充程序,例如https://addons.mozilla.org/en-US/firefox/addon/1882,这可能允许非常快速的提交.除了验证码,任何令最终用户烦恼的事情通常都不好,特别是在阻止一个人(非常)快速前进时. (8认同)
  • 请注意,SO就是这样的.连续快速或多次编辑评论,您将看到"你是一个人吗?" 页. (5认同)
  • 好点,但这一切都取决于上下文。如果该表单是登录表单,我完全同意你的观点。但为什么要禁用机器人登录呢?如果上下文是一个评论框,就像 StackOverflow 上的评论框一样,我可以肯定:如果您在评论框上使用自动填充功能,那么您就是垃圾邮件发送者。请注意,如果您使用自动填充签名,您仍然需要时间来实际键入内容。 (2认同)
  • 黑客不会总是要求表格.有时,精心设计的URL(使用GET或POST)足以轻松地多次发布表单. (2认同)

Rok*_*jan 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:

$("#dynamicForm").load("form.html #formContainer");
Run Code Online (Sandbox Code Playgroud)

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 );
    }
  });
}
Run Code Online (Sandbox Code Playgroud)
.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;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>
Run Code Online (Sandbox Code Playgroud)

3. Bot-bait输入

机器人喜欢(非常喜欢)俏皮的输入元素,如:

<input
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1" />
Run Code Online (Sandbox Code Playgroud)

他们会乐意像他们一样输入一些价值 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;
}
Run Code Online (Sandbox Code Playgroud)

既然你的输入对用户不可见,那么在PHP中你$_POST["email"] 应该是空的(没有任何价值)!否则请不要提交表格.

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

致谢:

Developer.Mozilla - 关闭表单自动完成
StackOverflow - 忽略Tabindex

  • 合法用户的浏览器是否可能将诱饵输入字段视为电子邮件字段,并在用户选择自动填充表单的其余部分时自动填充?用户不会看到远离屏幕的区域已被填充,并且它们仍然看起来像机器人. (7认同)

小智 19

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

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

希望这有帮助


小智 15

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

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

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

  • 这也将捕获那些无法遵循指示的用户,这可能是不可取的. (4认同)

小智 11

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

  • 我是一个盲目的用户,我发现了一个像这样的表单字段,上面的标签上写着:"如果你能看到这个,请留空." 非常有效的IMO. (5认同)
  • 这提出了可访问性问题.使用屏幕阅读器的用户不会隐藏蜜罐索引. (3认同)
  • 当你获得更多声誉而不是答案时,请添加此作为评论;) (2认同)

Ana*_*ran 8

http://recaptcha.net/

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

它已被谷歌(2009年)收购:

另见

  • 作为一个用户,我发现recaptcha很难经常弄清楚.有些单词很难阅读,最终你不得不尝试3到4次.虽然这肯定会有助于机器人问题. (5认同)

Joh*_*man 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>
Run Code Online (Sandbox Code Playgroud)

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

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

此外,验证码很棒,而且真的是防范垃圾邮件的最佳方法.


Gra*_*ble 5

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

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


优点:

  • 方便用户和开发者
  • 似乎是可靠的
  • 没有 JavaScript

缺点:

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


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


Ada*_*dam 5

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

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

如果这曾经是真的,现在不再是真的。

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

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用两个图像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" />
Run Code Online (Sandbox Code Playgroud)

出于可访问性的原因,您必须提供正确的文本替代方案,但我认为对于屏幕阅读器用户来说,长句子比被视为机器人更好。

附加说明:这些例子说明理解英语(或任何语言),并且不得不做出简单的选择,对于垃圾邮件机器人来说比:等待 10 秒、处理 CSS 或 javascript、知道字段被隐藏、模拟鼠标移动或模拟键盘打字,...