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

我试图想出一个足够好的反垃圾邮件机制,以防止自动生成的input。 我读过像captcha这样的技术,1 + 1 =? 东西工作得很好,但他们也提出了一个额外的步骤,阻止免费快速使用应用程序(我不喜欢这样的东西请)。

我已经尝试在我的所有表单中设置一些隐藏的字段, display: none; 但是,我敢肯定,脚本可以configuration为跟踪该表单字段ID,而不是填写它。

你是否实现了一个很好的反自动填充机器人方法? 有没有什么东西可以通过HTML和/或服务器端处理无缝地完成,并且(几乎)是防弹的? (没有JS可以简单地禁用它)。

我试图不依靠这个会话(即计算点击一个button多less次,以防止超载)。

一个易于实现但不是傻瓜式的(特别是“特定”攻击)解决反垃圾邮件的方式是跟踪表单提交和页面加载之间的时间。

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

人类inputURL,加载页面,在页面完全加载之前等待,向下滚动,阅读内容,决定是否评论/填写表格,需要时间填写表格,并提交。

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

实际上我发现一个简单的蜂蜜jar场效果很好。 大多数机器人填写他们看到的每一个表单字段,希望能够绕过所需的字段validation器。

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

如果您创build了一个文本框,将其隐藏在javascript中,然后确认服务器上的值为空白 ,这就排除了99%的机器人,并且不会导致99%的用户感到沮丧。 剩下的1%已禁用JavaScript,仍然会看到文本框,但是您可以为这些情况(如果您关心的话)添加一条消息,如“将此字段留空”。

(另外,注意如果你在场上做style =“display:none”,那么对于机器人来说看起来很简单,放弃这个领域,这就是为什么我更喜欢javascript方法)。

假如 – Bot没有find任何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>通知他们。 <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> <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. 创build一个form.html并把你的form放在一个<div id="formContainer">元素中。
  2. 比在你需要调用该窗体的页面内部,使用一个空的<div id="dynamicForm"></div>而这个jQuery:

 $("#dynamicForm").load("form.html #formContainer"); 

2.使用JS完全构build你的表单

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

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

如果它比15秒更快(取决于你的表格有多大或多less),那是一个机器人。

希望这个帮助

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

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

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

如何创build一个文本字段input框相同的颜色作为背景,必须保持空白。 这将解决机器人阅读显示的问题:无

http://recaptcha.net/

recaptcha是一个免费的抗体服务,有助于数字化书籍

许多这些垃圾邮件机器人只是服务器端脚本,在networking上徘徊。 您可以通过使用一些JavaScript来处理其中的很多人来处理发送之前的表单请求(即,基于某个客户端variables设置附加字段)。 这不是一个完整的解决scheme,并可能导致许多问题(例如,在移动设备上的用户没有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.'); } ?> 

此外,validation码是伟大的,真的是最好的防范垃圾邮件。

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

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

优点:

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

缺点:

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

例如,这个方法被WordPress插件Cookies用于评论 。

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

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

无论如何,对于来自台湾或印度的现场“机器人”,你们不会做太多的事情,每一个贴子链接都要付0.03美元,并且以这种方式生活。

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

它通过利用大多数HTML表单处理脚本(我使用FormMail.pl)的电子邮件ALIASfunction,以及graphics提交“代码”,这是很容易在最简单的graphics程序中创build的。 一个这样的graphics包括代码M19P17nH和提示“请input代码在左边”。

这个特定的例子使用随机的字母和数字序列,但我倾向于使用我的访客熟悉的非英语版本的单词(例如“pnofrtay”)。 请注意,窗体字段的提示内置在graphics中,而不是出现在窗体上。 因此,对于一个机器人来说,这个forms的领域并不知道它的目的。

唯一真正的技巧是确保你的表单html将这个代码分配给“收件人”variables。 然后,在您的邮件程序中,确保您使用的每个这样的代码被设置为电子邮件别名,该别名指向您要使用的任何电子邮件地址。 由于没有任何forms的机器人阅读和没有电子邮件地址的提示,所以不知道应该把什么放在空白表单域。 如果没有在表单字段或除了可接受的代码之外的任何东西,表单提交失败,并有一个“坏的收件人”的错误。 你可以在不同的表格上使用不同的graphics,虽然在我的经验中并不是必须的。

当然,一个人可以一瞬间解决这个问题,而不会有与reCAPTCHA和类似的,更优雅的scheme相关的所有问题。 如果人类垃圾邮件发送者确实对接收者失败做出了响应,并将图像代码编程到机器人中,那么一旦您意识到机器人已被硬编码进行响应,就可以轻松更改。 在使用这种方法的五年中,我从来没有使用过任何forms的垃圾邮件,也从来没有收到任何forms的用户投诉。 我确定这可能会被机器人的OCRfunction打败,但是我从来没有在使用过html表单的任何网站上发生过这种情况。 我也使用了“垃圾邮件陷阱”(隐藏“来吧”的html代码,指出我的反垃圾邮件政策)效果很好,但是它们只有大约90%有效。

我在这里想到很多东西:

  1. 使用JS(虽然你不想要它)跟踪鼠标移动,按键,鼠标点击
  2. 获取引荐url(在这种情况下,应该是一个来自同一个域名)…正常用户必须先浏览网站,然后才能到达联系表格: PHP:如何获取引荐url?
  3. 使用$ _SESSIONvariables获取IP,并检查表单提交IP列表
  4. 用一些虚拟文本填写一个文本字段,你可以在服务器端检查它是否被覆盖
  5. 检查浏览器版本: http : //chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html很明显,一个机器人不会使用浏览器,而只是一个脚本。
  6. 使用AJAX逐个发送字段,并检查提交之间的时间差异
  7. 在表单之前/之后使用伪造页面,只是发送另一个input

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

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

如果以前是真的,那就不是这样了。

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

  <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]button,改变每次加载后的顺序,文本替代,图像的内容(及其大小)或button的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" /> 

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

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

总而言之,每个解决scheme都有其优点和缺点。 如果用户不能通过反垃圾邮件机制以及可以通过的垃圾邮件机器人的数量,您将不得不寻找一个快乐的中位数。

我发现避免被漫游器垃圾邮件的最好的解决scheme是使用一个非常微不足道的问题或您的表单上的字段。

尝试添加一个像这样的字段:

  • 在框旁边复制“hello”
  • 1 + 1 =?
  • 在框中复制网站名称

这些技巧要求用户理解必须在表单上input什么,从而使其成为大型机器人表单填充的目标变得更加困难。

编辑

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

在JQuery网站上有一个关于这个的教程 。 虽然这是JQuery的想法是独立于框架。

如果JavaScript不可用,那么您可能需要回到CAPTCHAtypes的方法。

我发现要做到这一点的简单方法是放置一个值的字段,并要求用户删除该字段中的文本。 因为机器人只填满他们。 如果该字段不是空的,则意味着用户不是人,不会被张贴。 它与validation码相同的目的。

它只是一个想法,身份证使用在我的应用程序,运作良好

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

使用1)forms与令牌2)检查forms与IP地址形成延迟3)阻止IP(可选)

根据我的经验,如果表格只是一个“联系”的forms,你不需要特别的措施。 垃圾邮件通过networking邮件服务进行体面过滤(您可以通过服务器脚本跟踪networkingforms的请求,看看有效地到达您的电子邮件,当然我认为你有一个很好的networking邮件服务:D)

顺便说一句我试图不依靠这个会话(比如,点击一个button,以防止重载多less次)。

我不认为这是好事实际上,我想要实现的是接收来自用户的电子邮件,这些用户执行某些特定操作,因为这些用户是我感兴趣的用户(例如,查看“简历”页面并使用适当联系人的用户形成)。 所以,如果用户做了我想要的东西,我开始跟踪其会话,并设置一个cookie(我总是设置会话cookie,但是当我没有开始一个会话,它只是一个相信用户有会话的假的cookie)。 如果用户做了一些不必要的事情,我不打扰他保持一个会议,所以没有超载等

另外,对于我来说,广告服务提供某种types的API(可能已经存在)来查看用户是否在“看广告”,这对我来说是很好的,看广告的用户可能是真实的用户,但如果他们不是真的很好,至less你得到1视图,所以没有任何损失。 (并相信我,广告控制比任何你可以单独做的事情都要复杂)

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

这与其他反制措施相结合,应该使任何垃圾邮件机器人卸载他们的垃圾(我有一个留言簿担保与各种措施,到目前为止,他们已经下降了我的主要陷阱 – 但是,如果任何机器人绕过那里,那里是别人准备触发)。

我正在使用的是假表单字段的组合(也被描述为无效的字段,以防浏览器被使用,一般不处理CSS或显示:没有特别的),健全性检查(即input的格式有效?),时间戳(提交速度太快和太慢),MySQL(用于实现基于电子邮件和IP地址以及泛滥filter的黑名单),DNSBL(例如来自Spamhaus的SBL + XBL),文本分析例如对垃圾邮件有强烈指示的字词)和validation电子邮件(以确定提供的电子邮件地址是否有效)。

关于validation邮件的一个注意事项:这个步骤完全是可选的,但是当select实施时,这个过程必须尽可能地容易使用(也就是说,点击包含在电子邮件中的链接)并且使得所述电子邮件地址被列入白名单一段时间,以便在用户想要额外发布post的情况下避免后续的validation。

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

  2. 添加电子邮件validation 用户收到一封电子邮件,他需要点击一个链接。 否则在一段时间内丢掉post。

我已经添加了一个时间检查我的表格。 如果填写不到3秒钟,表格将不会被提交,这对我来说非常有用,特别是对于长表格。 这是我在提交button上调用的表单检查function

 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 } 

You can try to cheat spam-robots adding the correct action atribute after Javascript validation. so if the robot block javascript they never submit correctly the form.

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

I add a "callback" after .attr() to prevent errors

Robots cannot execute JavaScript so you do something like injecting some kind of hidden element into the page with JavaScript and then detecting it's presence prior to form submission but beware because some of your users will also have JavaScript disabled

Otherwise I think you will be forced to use a form of client proof of "humanness"

Just my five cents worth. If the object of this is to stop 99% of robots which sounds pretty good, and if 99% of robots can't run Java-script the best solution that beats all is simply to not use a form that has an action of submit with a post URL.

If the form is controlled via java-script and the java-script collects the form data and then sends it via a HTTP request, no robot can submit the form. Since the submit button would use Java-script to run the code that sends the form.