小编典典

阻止脚本编写者抨击您的网站

all

我已经接受了一个答案,但遗憾的是,我相信我们陷入了最初的最坏情况: CAPTCHA 每个人都在购买废话
。简短说明:缓存/网络农场无法跟踪点击,任何解决方法(发送非缓存网络信标、写入统一表等)都会比机器人更慢地降低网站速度。可能有来自 Cisco
或类似公司的一些昂贵的硬件可以在高水平上提供帮助,但如果每个人都可以进行 CAPTCHA
验证,则很难证明其成本是合理的。稍后我将尝试更完整的解释,并为将来的搜索者清理它(尽管欢迎其他人尝试,因为它是社区 wiki)。

情况

这是关于 woot.com 上的垃圾袋销售。我是 Woot Workshop 的总裁,它是 Woot
的子公司,负责设计、撰写产品描述、播客、博客文章并主持论坛。我使用
CSS/HTML,对其他技术几乎不熟悉。我与开发人员密切合作,并讨论了这里的所有答案(以及我们拥有的许多其他想法)。

可用性是我工作的重要组成部分,而让网站变得令人兴奋和有趣是剩下的大部分内容。这就是下面三个目标的来源。CAPTCHA
损害了可用性,机器人从我们的垃圾销售中窃取了乐趣和兴奋。

机器人会在第二次屏幕抓取(和/或扫描我们的 RSS)中猛烈抨击我们的首页数十次,以进行 Random Crap
销售。当他们看到这一点时,它会触发程序的第二阶段登录,点击我想要一个,填写表格,然后购买垃圾。

评估

lc:在使用此方法的 stackoverflow
和其他站点上,它们几乎总是与经过身份验证(登录)的用户打交道,因为正在尝试的任务需要这样做。

在 Woot 上,匿名(未登录)用户可以查看我们的主页。换句话说,slamming bot 可以是未经身份验证的(并且除了通过 IP
地址之外基本上是不可跟踪的)。

所以我们回到扫描IP,a)在这个云网络和垃圾邮件僵尸时代相当无用,b)考虑到来自一个IP地址的企业数量,它捕获了太多无辜者(更不用说问题了)非静态 IP
ISP 和试图跟踪这一点的潜在性能损失)。

哦,让人们打电话给我们将是最糟糕的情况。我们可以让他们给你打电话吗?

BradC:Ned Batchelder
的方法看起来很酷,但它们的设计非常牢固,可以击败为网站网络构建的机器人。我们的问题是机器人是专门为击败我们的网站而构建的。其中一些方法可能会在短时间内起作用,直到脚本编写者改进他们的机器人以忽略蜜罐,屏幕抓取附近的标签名称而不是表单
ID,并使用支持 javascript 的浏览器控件。

lc 再次:“当然,除非炒作是你营销计划的一部分。”
是的,绝对是。物品出现时的惊喜,以及如果你设法得到一件的兴奋,可能与你最终得到的废话一样重要或更重要。任何消除先到先得的行为都会损害“赢得”垃圾的快感。

novatrust:首先,我欢迎我们的新机器人霸主。实际上,我们确实提供 RSSfeeds 以允许 3rd
方应用程序扫描我们的站点以获取产品信息,但不会在主站点 HTML 之前。如果我的解释是正确的,那么您的解决方案确实通过完全牺牲目标 1 来帮助目标
2(性能问题),并且只是放弃机器人将购买大部分废话的事实。我对你的回答投了赞成票,因为你最后一段的悲观主义对我来说是准确的。这里似乎没有灵丹妙药。

其余的响应通常依赖于 IP 跟踪,这似乎既无用(僵尸网络/僵尸/云网络)又有害(捕获许多来自相同 IP 目的地的无辜者)。

还有其他方法/想法吗?我的开发人员一直在说“让我们做 CAPTCHA”,但我希望对于所有想要我们的废话的实际人类来说,有更少的侵入性方法。

原始问题

假设您正在销售具有很高感知价值的廉价商品,而您的数量非常有限。没有人确切知道您何时会出售此商品。超过 100 万人定期来看看你在卖什么。

您最终会遇到脚本编写者和机器人试图以编程方式 [a] 找出您何时出售所述物品,并 [b] 确保他们是第一批购买它的人。这很糟糕有两个原因:

  1. 您的网站遭到非人类的猛烈抨击,使所有人的一切都变慢了。
  2. 脚本编写者最终“赢得”了产品,导致常客感到受骗。

一个看似显而易见的解决方案是在下订单之前为您的用户创建一些跳线,但这至少存在三个问题:

  • 用户体验对人类来说很糟糕,因为他们必须破译验证码、挑选猫或解决数学问题。
  • 如果感知到的好处足够高,并且人群足够多,那么一些群体就会找到解决任何调整的方法,从而导致军备竞赛。(更简单的调整尤其如此;隐藏的“评论”表单、​​重新排列表单元素、错误标记它们、隐藏的“陷阱”文本都将工作一次,然后需要进行更改以对抗针对此特定表单.)
  • 即使脚本编写者无法“解决”您的调整,它也不会阻止他们猛击您的首页,然后发出警报让脚本编写者手动填写订单。鉴于他们从解决 [a] 中获得了优势,他们可能仍然会赢得 [b],因为他们将是第一个到达订单页面的人。此外,1. 仍然会发生,导致服务器错误和每个人的性能下降。

另一种解决方案是监视 IP 访问频率过高,阻止它们进入防火墙,或者以其他方式阻止它们排序。这可以解决 2. 并防止 [b] 但扫描 IP
对性能的影响是巨大的,并且可能会导致像 1. 这样的问题,而不是脚本编写者自己造成的问题。此外,云网络和垃圾邮件僵尸的可能性使 IP 检查毫无用处。

第三个想法,强制加载订单表格一段时间(比如半秒)可能会减慢快速订单的进度,但同样,脚本编写者仍然是第一个进入的人,只要速度不损害实际用户。

目标

  1. 将项目出售给非脚本人员。
  2. 保持网站以不被机器人减慢的速度运行。
  3. 不要让“普通”用户完成任何任务来证明他们是人类。

阅读 82

收藏
2022-03-13

共1个答案

小编典典

如何使用 CAPTCHA 实现类似 SO 的功能?

如果您正常使用该网站,您可能永远不会看到一个。如果您碰巧经常重新加载同一页面,太快地发布连续评论,或者触发警报的其他内容,请让他们证明他们是人类。在您的情况下,这可能是同一页面的不断重新加载,快速跟踪页面上的每个链接,或者填写订单的速度太快而无法成为人类。

如果他们连续 x 次未通过检查(例如,2 或 3 次),则给该 IP 一个超时或其他此类措施。然后在超时结束时,再次将它们转储回检查。


由于您有未注册的用户访问该站点,因此您确实只有 IP
可以继续。您可以向每个浏览器发出会话并根据需要进行跟踪。当然,如果连续(重新)创建了太多会话(以防机器人不断删除 cookie),请进行人工检查。

至于抓到太多无辜者,您可以在人工检查页面上提出免责声明:“如果太多匿名用户从同一位置查看我们的网站,也可能会出现此页面。我们鼓励您注册或登录以避免这。”
(适当调整措辞。)

此外,X 个人同时从一个 IP 加载相同页面的几率是多少?如果它们很高,那么您的机器人警报可能需要不同的触发机制。


编辑:另一种选择是,如果他们失败太多次,并且您对产品的需求充满信心,请阻止他们并让他们亲自打电话给您删除阻止。

让人们打电话似乎是一种愚蠢的措施,但它 可以确保在计算机后面的某个地方有人
。关键是只有在一个几乎永远不会发生的情况下才设置块,除非它是一个机器人(例如,连续多次失败检查)。然后它强制人机交互——拿起电话。

为了回应让他们给我打电话的评论,这里显然需要权衡取舍。您是否足够担心确保您的用户在打折时能够接听几个电话?如果我非常担心产品会接触到人类用户,我将不得不做出这个决定,也许会在此过程中牺牲我的一小部分时间。

由于您似乎决心不让机器人占上风/抨击您的网站,我相信手机可能是一个不错的选择。由于我没有从您的产品中获利,因此我没有兴趣接听这些电话。但是,如果您分享其中的一些利润,我可能会感兴趣。由于这是您的产品,因此您必须决定您关心的程度并相应地实施。


释放块的其他方法没有那么有效:超时(但他们会在之后再次抨击您的网站,冲洗重复),长时间超时(如果真的是人试图购买您的产品,他们将是 SOL
并因未通过检查而受到惩罚)、电子邮件(很容易由机器人完成)、传真(相同)或蜗牛邮件(花费太长时间)。

当然,您可以改为在每次超时时增加每个 IP 的超时时间。只要确保你不会无意中惩罚真正的人类。

2022-03-13