32

我试图找出一种防止机器人提交我的表单的好方法,同时保持过程简单。我已经阅读了几个很棒的想法,但我考虑在提交表单时添加一个确认选项。用户单击提交并弹出一个需要用户交互的 Javascript 确认提示。

这会阻止机器人还是机器人可以很容易地解决这个问题?下面是演示我的想法的代码和 JSFIddle:

JSFIDDLE

$('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;
}
4

10 回答 10

80

这是很多人都遇到过的一个问题。正如 user166390 在评论中指出的那样,机器人可以绕过 javascript 直接向服务器提交信息(参见cURLPostman等简单实用程序)。现在,许多机器人都能够使用 javascript 并与之交互。Hari krishnan 指出了验证的使用,其中最流行和最成功的(据我所知)是reCaptcha。但是验证码有其问题,并且被万维网纲要所劝阻,主要是因为无效和无法访问

为了避免我们忘记,攻击者总是可以部署人类智能来击败验证码。有攻击者付钱让人们破解验证码以发送垃圾邮件的故事,而工人却没有意识到他们正在参与非法活动。亚马逊提供了一项名为Mechanical Turk的服务来解决此类问题。如果您将他们的服务用于恶意目的,亚马逊会强烈反对,它的缺点是需要花钱和创建书面记录。然而,有更多的erhm提供者不会持有这样的反对意见。

所以,你可以做什么?

我最喜欢的机制是隐藏的复选框。让它有一个标签,比如“您同意使用我们服务的条款和条件吗?” 甚至可能带有一些严肃的术语的链接。但是您将其默认为未选中并通过 css 将其隐藏:将其放置在页面之外,将其放在零高度或零宽度的容器中,在其顶部放置一个具有更高 z-index 的 div。在这里滚动您自己的机制并发挥创造力。

秘密是没有人会看到复选框,但大多数机器人通过检查页面并直接操作它来填写表格,而不是通过实际视觉。因此,任何带有该复选框值集的表单都可以让您知道它不是由人填写的。这种技术称为机器人陷阱。自动表格填充机器人类型的经验法则是,如果人类必须通过调解来克服单个站点,那么他们就失去了通过传播他们的网站所能赚到的所有钱(以他们的时间形式)。垃圾邮件广告。

(以前的经验法则假设您正在保护论坛或评论表单。如果实际资金或个人信息在线,那么您需要的安全性不仅仅是一种启发式方法。这仍然是通过默默无闻的安全性,事实证明默默无闻足以保护您免受随意的脚本攻击。不要自欺欺人地认为这可以保护您的网站免受所有攻击。

另一半的秘密就是保守着。如果选中该框,请勿以任何方式更改响应。显示相同的确认,谢谢,或者之后的任何消息或页面。这将防止机器人知道它已被拒绝。

我也是计时方法的粉丝。您必须完全在服务器端实现它。跟踪以持久方式(基本上是会话)提供页面的时间,并将其与表单提交的时间进行比较。这可以防止伪造甚至让机器人知道它正在计时 - 如果您将服务时间作为表单或javascript,然后您就让他们知道您正在使用它们,从而邀请了一种更复杂的方法。

同样,在提供相同的感谢页面时,只需默默地丢弃请求(或者如果您想报复,则在响应垃圾邮件表单时引入延迟 - 这可能无法阻止它们压倒您的服务器,甚至可能让它们不堪重负通过保持更多连接打开更长的时间,您可以更快。此时,您需要硬件解决方案,负载平衡器设置上的防火墙)。

有很多关于延迟服务器响应以减缓攻击者的资源,通常以暴力密码尝试的形式。这个 IT 安全问题看起来是一个很好的起点。

关于 Captcha 的更新

关于计算机视觉和表单提交的主题,我一直在考虑更新这个问题。最近出现的一篇文章将我引向了计算机视觉爱好者Steve Hickson 的这篇博客文章。Snapchat(显然是某个社交媒体平台?我从来没有用过,感觉每天都变老了……)推出了一个新的类似验证码的系统,你必须识别包含鬼魂的图片(真的是卡通片)。Steve 证明这并不能验证提交者是否蹲下,因为在典型的方式中,计算机在识别这种简单类型的图像方面会更好更快。

不难想象将类似的方法扩展到其他 Captcha 类型。我进行了搜索,发现这些链接也很有趣:

reCaptcha 坏了吗?
实用的、非基于图像的验证码
如果我们知道验证码可以被击败,为什么我们还在使用它们?
使用 CAPTCHA 图像是否有真正的替代方法?
三名黑客如何让谷歌的 reCaptcha 崩溃——特别有趣,因为它是关于音频验证码的。

哦,如果没有强制性的XKCD 漫画,我们几乎是不完整的。

于 2013-03-10T07:51:46.783 回答
5

今天我成功地阻止了我的表单的持续垃圾邮件。当然,这种方法可能并不总是有效,但它很简单,并且在这种特殊情况下效果很好。

我做了以下事情:

  • 我将表单的 action 属性设置为mustusejavascript.asp,它只显示一条消息,表明提交无效并且访问者必须启用 javascript。

  • 我将表单的 onsubmit 属性设置为一个 javascript 函数,该函数将表单的 action 属性设置为真正的接收页面,例如receivemessage.asp

有问题的机器人显然不处理 javascript,所以我不再看到任何垃圾邮件。对于人类(打开了javascript)来说,它完全没有任何不便或额外的交互。如果访问者关闭了 javascript,他会在提交时收到明确的消息。

于 2014-03-05T00:35:46.217 回答
3

您的代码不会阻止机器人提交,但这不是因为您的代码如何。action那里的典型机器人更有可能对 URL(属性)进行外部/自动 POST 请求。典型的机器人不会呈现 HTML、CSS 或 JavaScript。他们正在阅读 HTML 并对其进行操作,因此不会执行任何客户端逻辑。例如,卷曲 URL 将获得标记,而无需加载或评估任何 JavaScript。可以创建一个简单的脚本来查找<form>然后使用匹配的键对该 URL 执行 CURL POST。

考虑到这一点,防止机器人提交的服务器端解决方案是必要的。验证码 + CSRF 就足够了。(http://en.wikipedia.org/wiki/Cross-site_request_forgery

于 2013-03-10T07:34:04.683 回答
3

不,您是否仍然认为 Captcha 或 ReCap 是安全的?

Bots nowDays 很聪明,可以使用 OCR 工具轻松识别图像上的字母(搜索即可理解)

我说保护自己免受自动表单提交的最佳方法是每次显示提交表单时添加一个隐藏的哈希生成(并存储在当前客户端的服务器上的会话中)!

当 Bot 或任何 Zombie 提交您检查给定哈希是否等于会话存储哈希的表单时,这就是全部;)

了解更多信息 阅读有关CSRF的信息!

于 2013-05-05T18:16:54.940 回答
2

您可以简单地添加captcha到您的表单中。由于验证码将在different并且也在 中images,因此机器人不能那样decode做。这是所有网站上使用最广泛的安全措施之一...

于 2013-03-10T07:32:22.360 回答
2

你不能用 javascript 实现你的目标。因为客户端可以解析您的 javascript 并绕过您的方法。您必须通过验证码在服务器端进行验证。主要思想是您在服务器端存储一个秘密,并使用服务器端的秘密验证从客户端提交的表单。

于 2013-03-10T07:36:09.750 回答
1

您可以测量注册时间,无需在文本框中填写永恒!

于 2013-03-10T07:35:51.520 回答
1

我遇到了阻止编程输入注册的表单输入验证。

我最初的策略是抓住元素并将其设置为我想要的选项。我触发了对输入字段的关注并模拟了对每个元素的单击以显示下拉菜单,然后设置触发事件以更改值的值。但是当我尝试单击保存未注册为已更改的输入时。

    ;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")

这让我重新思考如何通过直接操作鼠标的动作来模拟更多的鼠标类型行为选择来输入输入。不用说,我不必手动一张一张地上传图片来更新公司的产品图片。在字母前使用 Windows 编号将我的脚本放在目录末尾,当弹出图像上传窗口时,我必须使用主动可访问性从窗口获取 syslistview 并选择第二个元素,这是一张图片,第一个元素是一个文件夹. 或 findfirstfile 中的第一个元素仅返回文件调用。我使用该名称在项目数据库中搜索项目,然后访问这些项目并在上传图像后更新一些属性,然后我将文件从该文件夹移动到另一个文件夹,因此它不会

只是分享一个卑微的数据输入人员如何节省时间,并与所有这些邪恶的表单验证检查作斗争。

问候。

于 2014-10-05T00:27:02.207 回答
0

这是一个非常短的版本,自从 4 年前在我的网站上实施以来一直没有失败,随着时间的推移会根据需要增加差异。这可以使用您需要的所有变量和 if else 语句构建

    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()">

实际上,我今天来这里是为了了解如何将特定的垃圾邮件机器人 IP 地址重定向到 HELL .. 只是为了好玩

于 2018-08-12T15:02:41.937 回答
0

伟大的想法。

不久前,我删除了重新验证码,将我的contactform.html 转换为contactform.asp 并将其添加到顶部(显然,中间有一些代码来完整填写一些功能,如sendmail、验证表格填写完整等)。

    <%
     if Request.Form("Text") = 8 then
        dothis
      else
        send them to google.com
     end if
   %>

在表单上,​​我粘贴了一个带有名称 text 的基本文本字段,因此它看起来就像根本没有指定其用途的任何内容,然后我将一些文本粘贴在上方的 2 行红色中,说明在下面的框中输入什么 2 + 6 =提交您的请求。

于 2019-01-18T18:18:51.973 回答