Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止bot表单提交_Javascript_Jquery_Forms_Security_Spam - Fatal编程技术网

Javascript 防止bot表单提交

Javascript 防止bot表单提交,javascript,jquery,forms,security,spam,Javascript,Jquery,Forms,Security,Spam,我正试图找出一个好方法,防止机器人提交我的表单,同时保持过程简单。我读过几个好主意,但我想在提交表单时添加一个确认选项。用户单击submit,弹出一个Javascript确认提示,需要用户交互 这会阻止机器人吗?或者机器人会很容易解决这个问题吗?下面是演示我的想法的代码和JSFIDLE: 您只需在表单中添加captcha。由于CAPTCHA将与不同,并且在图像中也不同,因此机器人无法解码该验证码。这是所有WESITE最广泛使用的安全措施之一…您的代码不会阻止bot提交,但这不是因为您的代码是如

我正试图找出一个好方法,防止机器人提交我的表单,同时保持过程简单。我读过几个好主意,但我想在提交表单时添加一个确认选项。用户单击submit,弹出一个Javascript确认提示,需要用户交互

这会阻止机器人吗?或者机器人会很容易解决这个问题吗?下面是演示我的想法的代码和JSFIDLE:


您只需在表单中添加
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
   %>