如何防止机器人自动填充表单?
如何防止机器人自动填充表单?
我正在尝试找到一个足够好的反垃圾邮件机制来防止自动生成的输入。我了解到像验证码、1+1=?这样的技术可以很好地工作,但它们也会增加额外的步骤,阻碍了应用的自由快速使用(请不要提供这样的解决方案)。\n我尝试在所有的表单中设置一些隐藏字段,使用display: none;
。\n然而,我可以肯定地说,脚本可以配置以跟踪该表单字段ID,并简单地不填充它。\n您是否实施/了解一种良好的反自动填充机器人方法?是否有一些可以与HTML和/或服务器端处理无缝集成的方法,并且(几乎)无懈可击?(不使用JS,因为可以简单地禁用它)。\n我试图不依赖会话来实现这一点(即通过计算按钮点击次数来防止过载)。
如何防止机器人自动填充表单?
机器人无法找到任何表单的情况下怎么办?
三个例子:
1. 使用AJAX插入表单
如果您不介意用户禁用JS并且无法查看/提交表单,您可以使用noscript语句通知用户并要求他们先启用Javascript:
创建一个form.html文件,并将表单放在`
在需要调用该表单的页面中使用一个空的`
`和以下jQuery代码:`$("#dynamicForm").load("form.html #formContainer");`
2. 使用JS完全构建表单
// THE FORM var $form = $("", { appendTo : $("#formContainer"), class : "myForm", submit : AJAXSubmitForm }); // EMAIL 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 $("",{ name : "Message", // Needed for serialization placeholder : "Your message", appendTo : $form }); // SUBMIT BUTTON $("",{ 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; }
引入jQuery库:
3. 引入机器人捕获字段
机器人喜欢“有趣”的输入字段,如:
它们会很高兴输入一些值,比如`dsaZusil.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"]`应该是空的(没有任何值)!否则不要提交表单。
最后,您只需要在“机器人诱饵”输入字段之后创建另一个输入字段,用于实际用户的电子邮件地址:
``
感谢:
[Developer.Mozilla - Turning off form autocompletion](https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion)
[StackOverflow - Ignore Tabindex](https://stackoverflow.com/questions/5192859)
一个合法用户的浏览器是否有可能将机器人诱饵输入字段视为电子邮件字段,并在用户选择自动填充表单的其余部分时自动填充它?用户看不到远离屏幕的填充字段,他们看起来仍然像机器人。
我怀疑`autocomplete=nope`将默认为`on` 😉 MDN: [input#attr-autocomplete](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-autocomplete)
无论如何,这是一个机器人诱饵输入字段。您可以写`autocomplete="oh sunny day"`。
Buljan提供了创造性的反机器人解决方案,感谢分享!
如何防止机器人自动填充表单?
出现的原因:
- 机器人请求页面,解析页面并提交表单的速度很快,而人类加载页面、等待页面完全加载、滚动页面、阅读内容、决定是否填写表单、填写表单以及提交表单都需要时间,这两者之间的时间差异可能很微妙。
- 跟踪这种时间差异需要服务器端数据库,这可能影响性能。
- 需要调整时间阈值。
- 如果允许最终用户使用自动表单填充器,可能会加快提交速度。
解决方法:
- 实施一种简单但不完全可靠的反垃圾邮件方法,即跟踪表单提交和页面加载之间的时间。
- 使用服务器端数据库跟踪时间差异,以防止机器人自动填充表单。
- 如果表单提交过快,可以使用验证码来验证真实用户。
- 考虑上下文,如果表单是登录表单,则禁用机器人登录可能是合理的。如果表单是评论框,则使用自动填充评论框可能是垃圾邮件行为。
注意事项:
- 注意兼容自动表单填充插件,有些插件可能会导致非常快速的提交。
- 避免给最终用户带来困扰的任何东西,尤其是在阻止匆忙操作的人身上。
- 对于频繁请求表单的黑客,他们不一定总是请求表单,有时使用精心构建的URL(使用GET或POST)即可轻松多次提交表单。
- 当用户填写表单并收到错误时,纠正错误可能需要几秒钟。在第二次提交尝试时,表单已经完成,并且在短时间内再次提交。此外,还有自动填充浏览器扩展程序,这也会产生错误的判断。
- 机器人可以轻松实施延迟,用户也可以使用自动表单填充器。
这些方法可以结合使用,以增加对机器人自动填充表单的防护能力。
如何防止机器人自动填写表单?
出现原因:大多数机器人会填写他们看到的每个表单字段,希望绕过必填字段验证器。因此需要一种方法来识别并阻止机器人的自动填写。
解决方法:使用Honey Pot字段。创建一个文本框,通过javascript将其隐藏,然后在服务器上验证该值是否为空。这样可以筛选掉99%的机器人,而不会给用户造成任何困扰。对于那些禁用了javascript的用户,他们仍然可以看到这个文本框,但是可以添加一条消息如“请将此字段留空”。
如果使用display:none样式隐藏字段,机器人很容易就能看到并丢弃该字段,因此使用javascript方法更好。需要注意的是,机器人需要执行javascript才能看到这个隐藏字段。
此方法已在两个遭受机器人攻击的网站上使用,现在两个网站上的机器人注册为零。这对于有目标攻击的机器人可能无济于事,但大多数机器人只是寻找漏洞或者进行垃圾邮件发送。
为了解决禁用javascript的问题,可以使用CSS将Honey Pot输入框定位在页面顶部之上,这样即使禁用了javascript也不会影响。要绕过这个方法,机器人需要能够解析CSS绝对定位并根据常识判断它是否是一个Honey Pot。这种方式更加健壮。
还可以将Honey Pot字段放在页面下面另一个使用绝对定位的部分,通过z-order属性将其放在屏幕的可见范围之内,但对用户而言是不可见的。还可以使用tab键预防,以防用户意外地切换到隐藏的控件。
需要注意的是,这些方法只能阻止一般的垃圾邮件机器人,这些机器人会爬取互联网上的所有表单并发送垃圾邮件。如果有人专门针对您的表单制作机器人,那么这些方法可能无效。