How to prevent robots from automatically filling up a form?

I'm trying to come up with a good enough anti-spamming mechanism to prevent automatically generated input. I've read that techniques like captcha, 1+1=? stuff work well, but they also present an extra step impeding the free quick use of the application (I'm not looking for anything like that please).

I've tried setting some hidden fields in all of my forms, with display: none; However, I'm certain a script can be configured to trace that form field id and simply not fill it.

Do you implement/know of a good anti automatic-form-filling-robots method? Is there something that can be done seamlessly with HTML AND/OR server side processing, and be (almost) bulletproof? (without JS as one could simply disable it).

I'm trying not to rely on sessions for this (i.e. counting how many times a button is clicked to prevent overloads).

110452 次浏览

http://recaptcha.net/

ReCAPTCHA 是一个免费的反机器人服务,帮助数字化图书

It has been aquired by Google (in 2009):

Also see

许多垃圾邮件机器人只是在网络上徘徊的服务器端脚本。您可以通过使用一些 javascript 在表单请求发送之前对其进行操作(例如,基于某个客户端变量设置一个附加字段)来对抗其中的许多问题。这不是一个完整的解决方案,可能会导致许多问题(例如,用户 w/o javascript,在移动设备上,等等) ,但它可以成为攻击计划的一部分。

Here is a trivial example...

<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.');
}


?>

而且,验证码非常棒,是对抗垃圾邮件的最佳防御工具。

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

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

我找到的避免被僵尸程序发送垃圾邮件的最佳解决方案是在表单中使用一个非常琐碎的问题或字段。

尝试添加如下字段:

  • 把“你好”写在盒子旁边
  • 1 + 1 = ?
  • 复制框中的网站名称

这些技巧要求用户理解表单上必须输入的内容,因此很难成为大规模 bot 表单填充的目标。

剪辑

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

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

机器人请求一个页面,解析该页面并提交表单。这很快。

人类输入一个 URL,加载页面,等待页面完全加载,向下滚动,阅读内容,决定是否评论/填写表单,需要时间填写表单,并提交。

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

一个非常简单的方法是提供一些字段,比如 <textarea style="display:none;" name="input"></textarea>,并丢弃所有填充了这些字段的答复。

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

Anyway, you won't do much against live "bots" from Taiwan or India, that are paid $0.03 per one posted link, and make their living that way.

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

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

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

(另外,如果在字段中执行 style = “ display: none”,那么机器人很容易看到这个字段并放弃这个字段,这就是为什么我更喜欢 javascript 方法)。

我发现这样做的简单方法是放置一个带有值的字段,并要求用户删除该字段中的文本。因为机器人只会把它们装满。如果字段不是空的,则意味着用户不是人类,不会被发布。和验证码的目的是一样的。

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

如果它的速度超过15秒(取决于你的形状是大是小) ,那就是一个机器人。

Hope this help

如何创建一个文本字段输入框的颜色作为背景,必须保持空白。这将解决 bot 读取显示的问题: 无

一个非常有效的方法,虚拟消除垃圾邮件是有一个文本字段,其中包含文本,如“删除此文本,以提交表单!”为了提交表格,文本必须被删除。

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

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

I have a simple approach to stopping spammers which is 100% effective, at least in my experience, and avoids the use of reCAPTCHA and similar approaches. I went from close to 100 spams per day on one of my sites' html forms to zero for the last 5 years once I implemented this approach.

It works by taking advantage of the e-mail ALIAS capabilities of most html form handling scripts (I use FormMail.pl), along with a graphic submission "code", which is easily created in the most simple of graphics programs. One such graphic includes the code M19P17nH and the prompt "Please enter the code at left".

This particular example uses a random sequence of letters and numbers, but I tend to use non-English versions of words familiar to my visitors (e.g. "pnofrtay"). Note that the prompt for the form field is built into the graphic, rather than appearing on the form. Thus, to a robot, that form field presents no clue as to its purpose.

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

当然,人类可以在一瞬间解决这个问题,而不需要与 reCAPTCHA 和类似的、更优雅的方案相关的所有问题。如果人类垃圾邮件发送者确实响应了接收者的故障,并将图像代码编程到机器人中,那么一旦您意识到机器人已经被硬编码来响应,您就可以很容易地更改它。在使用这种方法的五年中,我从来没有收到过来自我使用它的任何表单的垃圾邮件,也从来没有收到过表单的任何人类用户的投诉。我确信这可以用机器人中的 OCR 能力打败,但是我从来没有在我的任何使用 html 表单的站点上发生过。我也曾经使用过“垃圾邮件陷阱”(隐藏的“ come hither”html 代码,它指向我的反垃圾邮件策略)来达到很好的效果,但是它们只有大约90% 的效果。

这只是一个想法,我在我的应用程序中使用它,并且工作得很好

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

根据我的经验,如果表单只是一个“联系”表单,你不需要特别的措施。垃圾邮件通过网络邮件服务得到很好的过滤(你可以通过服务器脚本跟踪网络表单请求,看看什么有效地到达你的电子邮件,当然我假设你有一个很好的网络邮件服务: D)

顺便说一下,我正在努力不依赖这个会议(喜欢,计算如何 多次单击按钮以防止过载)。

我不认为这是好的,事实上,我想实现的是收到电子邮件,从用户做一些特定的行动,因为这些用户是我感兴趣的(例如用户看“简历”页面,并使用适当的联系方式)。因此,如果用户做了我想要的事情,我开始跟踪它的会话并设置一个 cookie (我总是设置会话 cookie,但是当我没有启动一个会话时,它只是一个假的 cookie,让我相信用户有一个会话)。如果用户做了一些不想要的事情,我不会费心为他保留一个会话,这样就不会超负荷等等。

对我来说,如果广告服务提供某种类型的 API (可能已经存在)来查看用户是否“看过广告”,那么很可能看过广告的用户是真正的用户,但如果他们不是真正的用户,至少你可以看到1次,所以不会有什么损失。(相信我,广告控制比你单独做的任何事情都要复杂)

我在想很多事情:

  1. using JS (although you don't want it) to track mouse move, key press, mouse click
  2. 获得推荐网址(在这种情况下,应该是来自同一个域名) ... 普通用户必须浏览网站,然后才能到达联系表格: PHP: How to get referrer URL?
  3. using a $_SESSION variable to acquire the IP and check the form submit against that list of IPs
  4. 用一些虚拟文本填充一个文本字段,如果它被覆盖,可以在服务器端检查这些文本
  5. Check the browser version: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... It's clear that a bot won't use a browser but just a script.
  6. 使用 AJAX 逐个发送字段并检查提交之间的时间差
  7. 在表单之前/之后使用一个假页面,只是为了发送另一个输入

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

  • 在页面上,包含一个小的隐藏图像。
  • Place a cookie when serving this image.
  • 在处理表单提交时,检查 Cookie。


优点:

  • 方便用户和开发人员
  • 看起来很可靠
  • 没有 JavaScript

缺点:

  • 添加一个 HTTP 请求
  • requires cookies to be enabled on the client


例如,WordPress 插件 用于评论的 Cookies就使用了这种方法。

如果- 机器人根本找不到任何 form怎么办?

3个例子:

  1. Insert your form using AJAX
  • 如果你不介意用户禁用 JS,不能看到/提交表单,你可以通知他们,让他们先使用 noscript 语句启用 Javascript:
<noscript>
<p class="error">
ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
</p>
</noscript>
  • 创建一个 form.html并将 form放在一个 <div id="formContainer">元素中。

  • 在需要调用该表单的页面内部,使用一个空的 <div id="dynamicForm"></div>和这个 jQuery: $("#dynamicForm").load("form.html #formContainer");

  1. 完全使用 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>

  1. 机器人诱饵输入
  • 机器人喜欢(真的很强大喜欢) 很有魅力输入元素,如:
<input
type="text"
name="email"
id="email"
placeholder="Your email"
autocomplete="nope"
tabindex="-1"
They wll be happy to enter some value such as
`dsaZusil@kddGDHsj.com`
  • 使用以上 HTML 后,你也可以使用 CSS 不显示输入:
input[name=email]{ /* bait input */
/* do not use display:none or visibility:hidden
that will not fool the bot*/
position:absolute;
left:-2000px;
}
  • 现在您的输入不可见,用户期望在 PHP 中看到您的 $_POST["email"] 应该是空的(没有任何值) !否则不要提交表格。
  • 最后,所有您需要做的就是创建 另一个输入,如 <input name="sender" type="text" placeholder="Your email"> 之后“机器人诱饵”输入为实际用户的电子邮件地址。

鸣谢:

开发人员。 Mozilla-关闭表单自动完成
StackOverflow-忽略 Tabindex

事实上,display: none的陷阱非常有效。它有助于将 CSS 声明移动到包含任何全局样式表的文件中,这将迫使垃圾邮件机器人也加载这些样式表(垃圾邮件机器人可能会解释直接的 Style = “ display: none;”声明,文档本身中的本地样式声明也可能会解释这种声明)。

这与其他应对措施相结合,应该会使垃圾邮件机器人卸载垃圾邮件变得毫无意义(我有一本用各种措施保护的留言簿,到目前为止,它们已经落入了我的主要陷阱——然而,如果任何机器人绕过这些陷阱,还有其他机器人可以触发)。

我使用的是虚假表单字段(也被描述为无效字段,以防浏览器不能处理一般的 CSS 或者特别是 显示: 无)和完整性检查(即输入的格式是否有效?)的组合时间戳(过快和过慢提交) ,MySQL (用于实现基于电子邮件和 IP 地址以及洪水过滤器的黑名单) ,DNSBL (例如来自 Spamhaus 的 SBL + XBL) ,文本分析(例如是垃圾邮件的有力指示词)和验证电子邮件(以确定提供的电子邮件地址是否有效)。

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

  1. 我使用一个隐藏文本框的方法。由于机器人解析网站,他们可能填补它。然后我检查它,如果它是空的,如果它不是网站返回。

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

随着无头浏览器(如 phantomjs)的出现,它可以模拟任何东西,you can't假设:

  • spam bots do not use javascript,
  • 你可以跟踪鼠标事件来检测机器人,
  • 他们不会看到一个视觉隐藏的领域,
  • they won't wait a given time before submitting.

如果过去是这样,现在就不是了。

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

 <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" />

For accessibility reasons, you have to put a correct textual alternative, but I think that a long sentence is better for screenreaders users than being considered as a bot.

附加说明: 这些例子说明,理解英语(或任何语言) ,并作出一个简单的选择,是比较难的垃圾邮件程序: 等待10秒钟,处理 CSS 或 javascript,知道一个字段是隐藏的,模拟鼠标移动或模拟键盘输入,..。

我已经在表格中添加了时间检查。这些表格将不会被提交,如果填写在不到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


}

您可以在 Javascript 验证之后添加正确的 action 属性来欺骗垃圾邮件机器人。 如果机器人阻塞 Javascript,它们就永远无法正确地提交表单。

超文本标示语言

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

JAVASCRIPT (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()
});
})

然后在. attr ()后面添加一个“回调”以防止错误。

决定再加一个答案,抱歉。

We use a combination of two:

  1. 蜜罐字段与 name="email"(已经提到的其他答案)只是一定要使用一个复杂的方式来隐藏它,如移动离开屏幕或东西。因为机器人可以检测到 display:none
  2. 一个隐藏字段,当用户 clicks(或者 focuses,如果你希望是 TAB 友好的)在一个必需的字段(在其他答案中没有提到)时,由 JavaScript 设置

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

能屏蔽99% 的机器人。

附言。确保只在没有被密码管理器(如 LastPass 或1Passwor)填充的字段上使用焦点技巧。

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