我正在尝试提出一个足够好的反垃圾邮件机制来防止自动生成的输入.我读过像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方法的原因).
Pin*_*juh 71
一种易于实现但不是万无一失的(特别是"特定"攻击)解决反垃圾邮件的方法是跟踪表单提交和页面加载之间的时间.
机器人请求页面,解析页面并提交表单.这很快.
人类输入URL,加载页面,在页面完全加载前等待,向下滚动,阅读内容,决定评论/填写表格,需要时间填写表格,然后提交.
时间上的差异可能很微妙; 如何在没有cookie的情况下跟踪这个时间需要某种方式的服务器端数据库.这可能会对性能产生影响.
您还需要调整阈值时间.
Rok*_*jan 20
如果 - Bot根本找不到任何东西form怎么办?
3个例子:
如果您对使用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>.比,
form.html并放置form一个<div id="formContainer">元素. <div id="dynamicForm"></div>和这个jQuery:
$("#dynamicForm").load("form.html #formContainer");
Run Code Online (Sandbox Code Playgroud)
// 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)
机器人喜欢(非常喜欢)俏皮的输入元素,如:
<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
小智 15
实际上消除垃圾邮件的一种非常有效的方法是使文本字段中包含文本,例如"删除此文本以提交表单!" 并且必须删除该文本才能提交表单.
在表单验证后,如果文本字段包含原始文本或任何随机文本,请不要提交表单.机器人可以阅读表单名称并自动填写姓名和电子邮件字段,但不知道他们是否必须从某个字段中删除文本才能提交.
我在公司网站上实施了这种方法,它完全消除了我们每天收到的垃圾邮件.真的行!
小智 11
如何创建一个文本字段输入框与背景相同的颜色,必须保持空白.这将解决机器人阅读显示的问题:无
reCAPTCHA是一种免费的抗菌服务,可以帮助数字化书籍
它已被谷歌(2009年)收购:
另见
其中许多垃圾邮件机器人只是服务器端脚本,它们会使网络徘徊.您可以通过使用一些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)
此外,验证码很棒,而且真的是防范垃圾邮件的最佳方法.
我很惊讶还没有人提到这种方法:
优点:
缺点:
例如,此方法由 WordPress 插件Cookies for Comments 使用。
随着可以模拟任何东西的无头浏览器(如 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、知道字段被隐藏、模拟鼠标移动或模拟键盘打字,...