Javascript 防止bot表单提交
我正试图找出一个好方法,防止机器人提交我的表单,同时保持过程简单。我读过几个好主意,但我想在提交表单时添加一个确认选项。用户单击submit,弹出一个Javascript确认提示,需要用户交互 这会阻止机器人吗?或者机器人会很容易解决这个问题吗?下面是演示我的想法的代码和JSFIDLE:Javascript 防止bot表单提交,javascript,jquery,forms,security,spam,Javascript,Jquery,Forms,Security,Spam,我正试图找出一个好方法,防止机器人提交我的表单,同时保持过程简单。我读过几个好主意,但我想在提交表单时添加一个确认选项。用户单击submit,弹出一个Javascript确认提示,需要用户交互 这会阻止机器人吗?或者机器人会很容易解决这个问题吗?下面是演示我的想法的代码和JSFIDLE: 您只需在表单中添加captcha。由于CAPTCHA将与不同,并且在图像中也不同,因此机器人无法解码该验证码。这是所有WESITE最广泛使用的安全措施之一…您的代码不会阻止bot提交,但这不是因为您的代码是如
您只需在表单中添加
captcha
。由于CAPTCHA将与不同
,并且在图像中也不同
,因此机器人无法解码该验证码。这是所有WESITE最广泛使用的安全措施之一…您的代码不会阻止bot提交,但这不是因为您的代码是如何使用的。典型的bot更可能对URL执行外部/自动POST请求(action
attribute)。典型的机器人程序不会呈现HTML、CSS或JavaScript。他们正在读取HTML并对其进行操作,因此不会执行任何客户端逻辑。例如,卷曲URL将获得标记,而无需加载或计算任何JavaScript。可以创建一个简单的脚本来查找
,然后使用匹配的键向该URL发送CURL帖子
考虑到这一点,需要一个服务器端解决方案来防止bot提交。验证码+CSRF就足够了。()您可以测量注册时间,无需填写文本框 使用javascript无法实现您的目标。因为客户端可以解析您的javascript并绕过您的方法。您必须通过CAPTCHA在服务器端进行验证。其主要思想是在服务器端存储一个秘密,并使用服务器端的秘密验证从客户端提交的表单。这是许多人都遇到过的一个问题。正如user166390在评论中指出的那样,bot可以绕过javascript直接向服务器提交信息(参见和等简单实用程序)。现在很多机器人都能够使用javascript并与之交互。哈里克里希南指出了使用,据我所知,最普遍和最成功的是。但CAPTCHA有其独特的功能,并且被《万维网简编》所阻止,主要是出于安全原因
为了避免我们忘记,攻击者总是可以部署人类智能来击败验证码。有这样的故事,攻击者付钱让人们破解密码,用于垃圾邮件目的,而工人们却没有意识到他们参与了非法活动。Amazon提供了一个名为的服务,可以解决类似的问题。如果你将他们的服务用于恶意目的,亚马逊会极力反对,而且这样做的缺点是花钱和创建书面记录。然而,有更多的erhm提供商不会有这样的反对意见
那你能做什么呢?
我最喜欢的机制是隐藏复选框。让它有一个像“你同意使用我们服务的条款和条件吗?”这样的标签,甚至可以链接到一些严肃的条款。但您可以将其默认为未选中并通过css隐藏:将其放置在页面外,将其放置在高度为零或宽度为零的容器中,在其顶部放置一个具有更高z索引的div。在这里滚动您自己的机制并发挥创意
秘密在于没有人会看到复选框,但大多数机器人通过检查页面并直接操作来填写表单,而不是通过实际的视觉。因此,任何带有该复选框值集的表单都允许您知道它不是由人填写的。这项技术被称为a。自动填表机器人的经验法则是,如果一个人必须调解以克服一个单独的站点,那么他们就失去了传播垃圾邮件广告所能赚到的所有钱(以他们的时间为单位)
(前面的经验法则假设你在保护论坛或评论表单。如果实际的金钱或个人信息在网上,那么你需要更多的安全性,而不仅仅是一个启发式。这仍然是,事实证明,模糊性足以保护你免受偶然的、脚本式的攻击。不要自欺欺人地认为这是安全的让您的网站免受所有攻击。)
保密的另一半是保密。如果复选框被选中,则不要以任何方式更改响应。随后显示相同的确认、谢谢或任何消息或页面。这将防止bot知道它已被拒绝
我也是计时方法的粉丝。你必须完全在服务器端实现它。以持久的方式跟踪页面的服务时间(基本上是会话)并将其与表单提交的时间进行比较。这可以防止伪造,甚至让机器人知道它正在计时——如果你将服务时间作为表单或javascript的一部分,那么你就让他们知道你在关注他们,从而引入更复杂的方法
不过,在服务相同的感谢页面时,只需默默地放弃请求即可(或者,如果你想报复的话,在响应垃圾邮件表单时引入延迟-这可能不会阻止他们压倒你的服务器,甚至可能让他们更快压倒你,让更多的连接保持更长的开放时间。在这一点上,你需要一个硬件解决方案,负载平衡器上的防火墙设置)
关于延迟服务器响应以减缓攻击者的速度有很多资源,通常是以暴力密码尝试的形式。看起来是一个很好的起点
关于验证码的更新
关于计算机视觉和表单提交的话题,我一直在考虑更新这个问题。最近出现了一篇文章,指出我是一位计算机视觉爱好者。Snapchat(显然是一些社交媒体平台?我从未使用过它,每天都感觉老了…)推出了一个新的类似验证码的系统
$('button').click(function () {
if(Confirm()) {
alert('Form submitted');
/* perform a $.post() to php */
}
else {
alert('Form not submitted');
}
});
function Confirm() {
var _question = confirm('Are you sure about this?');
var _response = (_question) ? true : false;
return _response;
}
;failed automation attempt because window doesnt register changes.
;$iUse = _IEGetObjById($nIE,"InternalUseOnly_id")
;_IEAction($iUse,"focus")
;_IEAction($iUse,"click")
;_IEFormElementOptionSelect($iUse,1,1,"byIndex")
;$iEdit = _IEGetObjById($nIE,"canEdit_id")
;_IEAction($iEdit,"focus")
;_IEAction($iEdit,"click")
;_IEFormElementOptionSelect($iEdit,1,1,"byIndex")
;$iTalent = _IEGetObjById($nIE,"TalentReleaseFile_id")
;_IEAction($iTalent,"focus")
;_IEAction($iTalent,"click")
;_IEFormElementOptionSelect($iTalent,2,1,"byIndex")
;Sleep(1000)
;_IEAction(_IETagNameGetCollection($nIE,"button",1),"click")
function spamChk() {
var ent1 = document.MyForm.Email.value
var str1 = ent1.toLowerCase();
if (str1.includes("noreply")) {
document.MyForm.reset();
}
<input type="text" name="Email" oninput="spamChk()">
<%
if Request.Form("Text") = 8 then
dothis
else
send them to google.com
end if
%>