阻止脚本撞击您的网站

502
我已经接受了一个答案,但不幸的是,我认为我们仍然被困在最初的最坏情况下:使用CAPTCHA来防止购买尝试垃圾商品。简短地说,缓存/网络农场使得无法追踪点击量,而任何解决方法(发送非缓存的网络信标,写入统一表格等)会比机器人更加拖慢网站速度。可能有一些来自Cisco或类似公司的昂贵硬件可以在高水平上提供帮助,但如果CAPTCHA成为一种替代方案,很难证明其成本效益。稍后我将尝试进行更全面的解释,并对此进行清理以供未来搜索(虽然欢迎其他人尝试,因为它是社区Wiki)。

情况

这是关于woot.com上垃圾销售的问题。我是Woot Workshop的总裁,这是Woot的子公司,负责设计、编写产品描述、播客、博客文章和论坛的管理。我只熟悉CSS/HTML并且对其他技术知之甚少。我与开发者密切合作,并讨论了所有的回答(以及我们提出的许多其他想法)。

可用性是我的工作的重要组成部分,使网站充满乐趣和激情是其余部分的大部分内容。这就是下面三个目标的来源。CAPTCHA会破坏可用性,而机器人则会夺走我们垃圾销售的乐趣和激情。

机器人正在以每秒数十次的速度猛攻我们的首页,屏幕抓取(和/或扫描我们的RSS)来查找随机垃圾销售。一旦它们看到了这个,就触发了程序的第二阶段,即登录、点击我想要一个、填写表格并购买垃圾。

评估

lc:在Stack Overflow和其他使用此方法的网站上,它们几乎总是处理经过身份验证(已登录)的用户,因为需要进行尝试的任务需要。

在Woot上,匿名(未登录)用户可以查看我们的主页。换句话说,猛攻机器人可以是非认证的(基本上是不可跟踪的,除非通过IP地址)。

因此,我们又回到了扫描IP的问题,a)在这个云网络和垃圾邮件僵尸的时代,这种方式几乎没有用,b)由于许多企业来自一个IP地址(更不用说非静态IP ISP的问题和尝试跟踪可能带来的性能损失),会抓住太多无辜者。

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

BradC: 纳德·巴切尔的方法看起来不错,但它们基本上是为了打败一组网站而设计的机器人。我们的问题是机器人专门针对我们的网站进行构建。其中一些方法可能会在短时间内奏效,直到脚本作者进化出可以忽略诱饵、屏幕截图附近标签名称而非表单ID以及使用具有JavaScript功能的浏览器控件的机器人。

 

lc again: “当然,如果炒作是您的营销计划的一部分。” 是的,确实是这样。项目出现的惊喜,以及如果您设法获得一个的兴奋程度可能与或更重要,比您最终得到的垃圾物品。任何消除先到先得的东西都会削弱抢到“垃圾”的激情。

 

novatrust: 我为新的机器人霸主感到高兴。我们实际上提供了RSS订阅以允许第三方应用扫描我们的产品信息,但不能超越主站HTML。如果我理解正确,您的解决方案确实有助于实现目标2(性能问题),但会完全牺牲目标1,只是接受机器人将购买大部分垃圾这一事实。我投了您的回答因为我认为您最后一段的悲观论调很准确。这里似乎没有银弹。

其他反应通常依赖于IP跟踪,但似乎既无用(对于僵尸网络/云网络)又会捕捉到许多从相同IP目的地过来的无辜者。

还有其他方法/想法吗?我的开发人员一直说“让我们只做CAPTCHA”,但我希望有不那么侵入性的方法来满足所有真正想要购买我们垃圾物品的人。

原始问题

假设你在销售价格很便宜但具有非常高的感知价值的东西,并且你只有很少的数量。没有人确切地知道您何时将销售此项目。每天会有超过一百万人经常来看看您正在出售什么。

最终,脚本作者和机器人尝试以编程方式[a]弄清楚何时出售该物品,并[b]确保他们是第一个购买的人。这有两个缺点:

  1. 非人类用户拖慢了您的站点,使所有人都变得缓慢。
  2. 脚本作者最终“赢得”产品,使常规用户感到受骗。
一个看似明显的解决方案是在用户下订单之前设置一些障碍,但这种方法至少存在三个问题:
  • 对于普通人来说,用户体验很差,因为他们必须解密CAPTCHA、挑选猫或解决数学问题。
  • 如果感知到的收益足够高且人群足够庞大,某些人群将找到绕过任何微调的方式,从而导致武器竞赛。 (特别是当微调越简单;隐藏的“注释”表单,重新排列表单元素,错误标记它们,隐藏的“gotcha”文本都会起作用,并且需要更改以抵抗针对该特定表单的攻击)
  • 即使脚本作者无法“解决”您的微调,也不会防止他们在前端页面上滥用,然后发出警报,让脚本作者手动填写订单。考虑到他们从[a]中获得了优势,他们可能仍然会赢得[b],因为他们将是第一个到达订单页面的人类。此外,1.仍会发生,导致服务器错误并降低所有人的性能。
另一个解决方案是检测IP是否频繁访问,将其阻止到防火墙,或以其他方式防止其下订单。这可以解决2.并防止[b],但扫描IP的性能影响巨大,可能会像1.一样导致更多问题,而不是脚本作者自身造成的问题。此外,云网络和垃圾邮件机器人僵尸使IP检查相当无用。 第三个想法是强制加载订单表单一段时间(例如半秒钟),这可能会减缓快速订单的进展,但脚本作者仍将第一个进入,任何速度对实际用户不会有不利影响。

目标

  1. 向非脚本编写的人出售商品。
  2. 保持网站运行速度,不受机器人减速的影响。
  3. 不要让“正常”用户完成任何任务来证明他们是人类。

1
我认为你的目标是相互矛盾的:保持体验不变,但又想摆脱机器人。我认为你不能在不牺牲其中一部分的情况下同时达到这两个目标。 - max
这是一个社区维基,所以请随意尝试,但我主要是尽可能清楚地涵盖每个点,考虑到有明显的尝试过但已经被排除的事情。 - Dave Rutledge
为什么不只缓存重复请求的页面,而不更新它们呢?IPv4和MAC地址总共有32 + 48位。对于100万个用户来说,这是10MB,不应该是问题。IPv4和MAC的组合应该能够更准确地跟踪各种用户。 - John Leidegren
5
为什么要让匿名用户看到垃圾销售品,我不太明白。为什么不只向已登录的用户提供呢?这样做的话,未知用户就不会频繁访问该页面,然后可以禁止不良用户。 - Ryan Guill
2
我认为一些人在这里忽略了一个关键因素:这些机器人是设置成可以登录和购买的。它们确实知道有效账户并且能够登录。此外,真正使用 woot 的人会在物品即将出现时坐在那里,每2-5秒按F5重新加载。这是有效的正常人类使用行为。 - CodingWithSpike
显示剩余3条评论
130个回答

244

有没有实现类似 SO 的验证码那样的东西?

如果您正常使用网站,可能永远不会看到它。如果您频繁刷新同一页、快速连续发布评论或者其他触发警报的行为,他们就需要证明自己是人类。在您的情况下,这可能是同一页面不断刷新,快速跟踪页面上的所有链接,或者填写订单表格太快而不能是人类。

如果他们连续 x 次未通过检查(比如 2 或 3 次),则给该 IP 超时或其他措施。然后在超时结束时,将他们转回到检查页面。


由于您有未注册用户访问网站,因此只能依赖 IP。如果您希望,可以向每个浏览器分配会话并进行跟踪。当然,如果连续创建过多会话(以防机器人删除 cookie),也会显示人类检查。

至于捕获过多无辜者的问题,您可以在人类检查页面上放置免责声明:“如果来自同一位置的匿名用户过多地查看我们的网站,此页面也可能出现。我们建议您注册或登录以避免此情况。”(适当调整措辞。)

此外, X 个人从一个 IP 同时加载相同的页面的可能性有多大?如果很高,也许您需要为机器人警报设计不同的触发机制。


编辑:另一种选择是如果他们失败了太多次,并且您对产品的需求有信心,就屏蔽他们并让他们亲自打电话给您解除屏蔽。

让人们打电话似乎是一项愚蠢的措施,但它确保在电脑后面有一个真正的人。关键是只有在某种几乎不会发生的条件下(例如连续多次未通过检查),才将块放置在场景中。然后它强制进行人类交互-接听电话。

针对让他们打电话给我这个评论,显然存在一个权衡。你是否非常担心确保你的用户是人类而愿意在销售时接受几通电话?如果我真的很关心产品能够到达人类用户,我将不得不做出这个决定,也许会在此过程中牺牲一些(少量)时间。

既然看起来你决心不让机器人占上风/破坏你的网站,我认为电话可能是一个好选择。由于我不从你的产品中获利,我对接收这些电话没有兴趣。然而,如果你分享一些利润,我可能会产生兴趣。因为这是你的产品,所以你必须决定你有多在意并相应地实施。


释放阻止的其他方法并不那么有效:超时(但在此之后,它们会再次猛攻你的网站,反复洗涤),长时间超时(如果真的是人类试图购买你的产品,他们就会失败并受到惩罚),电子邮件(容易被机器人完成),传真(同样),或者普通邮件(太慢了)。

当然,你也可以让超时时间每个IP地址逐渐增加。只要确保不会无意中惩罚真正的人类。


13
谷歌使用相同的方法,他们只有IP地址可用。我在工作中经常会在搜索谷歌之前收到验证码,因为他们从同一个IP地址发现了类似机器人的行为。我认为这种方法(在类似机器人的行为后使用验证码)是你能得到的最好的方法。 - Ross
8
我曾经被 Google 要求进行 CAPTCHA 验证,但这是我的错 - 我将其当作计算器使用,做了数十个几乎相同的计算。 - Marcus Downing
CAPTCHA选项对我来说听起来很不错。它可以有效地防止机器人攻击,如果平衡得当,就不会影响到合法用户的使用。 - xan
不要锁定用户并使用电话,你能否生成一个临时的电子邮件地址,例如cur92Siva@site.com,但是使用图像生成前半部分。 - Sam
这也可能行得通,除非机器人只是习惯了系统并可以屏幕抓取电子邮件地址。我打电话的意图是它实际上强制进行人类互动,并要求用户用自己的声音直接解释自己。机器人所有者可能不想这样做。 - lc.
Demonoid也是这样做的,如果你在y时间内下载超过x个种子,它们会让你通过CAPTCHA进行身份验证。 - Chris Lloyd

204

你需要想办法让机器人购买昂贵得多的商品:12毫米螺帽价格为20美元。看看有多少机器人会在脚本编写者发现你正在操纵他们之前抢购。

利用利润购买更多的服务器并支付带宽费用。


16
如果他们后来退还物品或发起退款申请怎么办? 这可能会让你付出代价,而且退款申请可能会伤害你的信用卡处理商业务。这些机器人很可能也在使用被盗的信用卡,但这可能会使退款纠纷加剧,因为更高金额的纠纷会更频繁地受到挑战。 - Tai Squared
17
不要收取他们的费用,但标记他们为机器人,特别是试图购买该物品的机器人。如果有人购买假货,则仅将其标记为机器人,并禁止他们。您可以将其锁定几个小时。 - Kibbee
5
这段话的意思是:这有很大的喜剧效果,但如果你得罪了一个脚本小子,他的技能不仅局限于抓取Woot数据,那么你就会因为欺骗他而引起真正的问题。 - MattBelanger
2
如果脚本小子生气了,他们可能会暴露足够的信息让你标记并将他们交给执法部门。 - Jacco
11
sqook说:这不是一种技术解决方案,而是一种真实世界的解决方案。在银行放置带枪的保安也是一样的道理。这可能看起来很强硬,但罪犯也很强硬,所以要坚定立场。打击他们最痛的地方直到他们停止。 - Christopher Mahan
显示剩余8条评论

166

我的解决方案是,对于“机器人”和脚本,在屏幕抓取(screen-scraping)时加入约10分钟的延迟,使其变得毫无意义。

我会这样做:

  • 记录并识别任何重复造访者。

您不需要记录每次点击的所有IP地址。只需大约跟踪每20次中的其中一次即可。重复犯罪分子仍将在随机跟踪中出现。

  • 保留您的页面缓存,大约早于10分钟。

  • 当重复造访者/机器人访问您的网站时,请给他们10分钟前的缓存页面。

他们不会立即知道他们正在获取一个旧网站。他们仍然可以进行屏幕抓取,并获得所有信息,但他们不再能赢得任何比赛,因为“真正的人”将领先10分钟。

好处:

  • 没有用户麻烦或问题(如CAPTCHA)。
  • 完全在服务器端实现。(不依赖于Javascript/Flash)
  • 提供旧的缓存页面应该比提供实时页面的性能开销更小。您实际上可以通过这种方式减轻服务器的负载!

缺点:

  • 需要跟踪一些IP地址。
  • 需要保留和维护旧网页的缓存。

1
该死。我刚花了一个半小时编写了自己的五向量方案来应对woot,经过长时间的思考和艰难研究我的第五个反制措施(一个僵尸网络的限速器),我不得不承认失败。它不起作用。而我花了整整一个小时的解决方案就是这个 - 这一个。abelenky,我向你致敬。 - Jens Roland
7
在此基础上进行扩展:将IP地址放入内存中的LRU计数哈希表中(每次IP返回时增加并推到顶部)。根据反向IP信息、活动、图像/JS/ cookie下载等启发式方法,添加防护策略。根据攻击的严重程度来调整响应,以最小化假阴性的影响。 - SquareCog
1
我的技术并不会将任何人排除在外或禁止他们。它只是会延迟提供信息。从客户服务/可访问性的角度来看,办公室里没有人会赢得奖品,但这并不是什么大问题。 - abelenky
20
如果你给它们一个专门的机器人页面,它们最终会学会检测到它,并更准确地模拟常规客户端。而提供旧页面,则它们根本不知道自己正在接收旧数据。虽然旧数据对竞赛目的没有用,但它是合法的! - abelenky
1
非常感谢那些给我的想法点赞的人。即使悬赏已经结束,我认为这个想法在实现上比验证码更容易,更不容易骚扰人类,并且更有可能挫败机器人。我希望有人能在某个网站上尝试一下这个想法。 - abelenky
显示剩余5条评论

55

请查看这篇由Ned Batchelder撰写的文章。他的文章是关于如何防止垃圾机器人,但是同样的技术也可以轻松应用到您的网站中。

我们可以通过让机器人难以成功发布帖子或者让它们无意中自我识别来阻止它们,而不是通过让人们进行身份验证来停止机器人。这将减轻人们的负担,并使评论表单免受可见的反垃圾邮件措施的影响。

这就是我在此网站上防止垃圾机器人的方法。它可行。这里描述的方法根本不考虑内容。

还有一些其他想法:

  • 创建一个正式的自动通知机制(RSS订阅?Twitter?),人们可以在产品上市时订阅。这将减少人们编写脚本的需求
  • 在新商品上市之前立即更改您的混淆技术。因此,即使脚本编写者可以升级这场军备竞赛,他们始终落后一天。

编辑:为了完全清楚,上面的Ned的文章描述了通过阻止机器人填写订单表单来防止自动购买商品的方法。他的技术对于防止机器人屏幕抓取主页以确定何时推出胡萝卜搭配包这样的商品并不十分有用。我不确定是否真的有可能防止这种情况的发生。

关于您对Ned的策略有效性的评论:是的,他讨论了蜜罐,但我认为这不是他最强大的策略。他讨论的SPINNER是我在原帖中提到他的文章的最初原因。很抱歉我没有在原始帖子中表述得更清楚:

Spinner是一个隐藏字段,用于几个方面:它将多个值哈希在一起以防止篡改和重放攻击,并用于模糊化字段名称。 Spinner是以下内容的MD5哈希:

  • 时间戳,
  • 客户端的IP地址,
  • 被评论博客条目的入口ID,和
  • 一个密钥。
  • 以下是WOOT.com的实现方法:

    每次有新商品上架时,更改用作哈希的“secret”值。这意味着,如果有人想设计一个自动购买商品的BOT,它只能在下一件商品上架之前有效

    即使有人能够快速重建他们的机器人,所有其他真正的用户都已经购买了BOC,你的问题也得到解决!

    他讨论的另一种策略是,定期更改蜜罐技术(再次,在新商品上架时更改):

    • 使用CSS类(当然要随机化)将字段或包含元素设置为display:none。
    • 将字段颜色设置为与页面背景相同(或非常相似)。
    • 使用定位将字段移动到页面的不可见区域。
    • 使元素太小而无法显示其中包含的蜜罐字段。
    • 将蜜罐保持可见状态,但使用定位将其覆盖以遮挡。
    • 使用Javascript来实现任何这些更改,需要机器人具备完整的Javascript引擎。
    • 像其他字段一样保留蜜罐的显示状态,但告诉人们不要在其中输入任何内容。

    我想我的总体想法是,在每次新商品上架时更改表单设计。或者至少,在新BOC上架时更改它。

    这是什么,每个月几次?


+1 for the RSS。确保合法用户得到奖励。 - Marcus Downing
RSS看起来是一个不错的解决方案,但这会影响到我猜测这个网站所依赖的广告收入吗? - TM.
2
我不太理解“spinner”的概念。这只是一个额外的数据块,放置在HTML的<form>中,在提交时一起发送吗?因为机器人也可以轻松地抓取它。 - Ponkadoodle

45

问:如何防止脚本程序以每秒数百次的速度冲击您的网站?
答:您无法做到这一点。没有办法通过外部代理来防止这种行为。

您可以采用广泛的技术来分析传入的请求,并试图启发式地确定谁是人类,谁不是...但会失败。如果不是立即,那么最终也会失败。

唯一可行的长期解决方案是改变游戏规则,使网站对机器人不友好,或对撰写脚本者不太有吸引力。

如何做到这一点?嗯,这是一个不同的问题! ;-)

...

好了,上面已经给出(并被拒绝)了一些选项。我对您的网站不是非常熟悉,只看过一次,但由于人们可以读取图像中的文本,而机器人不能轻易做到这一点,所以将公告更改为图像。 不是验证码,只是图片 -

  • 当页面被请求时生成图像(当然是缓存的)
  • 保持图像源名称相同,以免暴露
  • 大多数情况下,图像中会有普通文本,并且与行内HTML页面的一部分对齐
  • 当游戏开始时,图像会更改为公告文本
  • 公告文本显示一个URL和/或代码,必须手动输入才能获得奖品。如果需要,请在代码上加入验证码,但这可能并不必要。
  • 为了增强安全性,该代码可以是针对请求/IP/代理专门生成的一次性令牌,以便重复请求生成不同的代码。如果按需生成太费力,则可以预先生成一堆随机代码(一次性密码本)。

运行真实用户对此作出反应的运行时间试验,并忽略比这个时间快(比如说一半)的响应(“糟糕,发生了错误,请再试一次”)。此事件还应触发一个警报给开发人员,表明至少有一个机器人已经找到了代码/游戏,因此是时候改变代码/游戏了。

即使没有机器人触发,也应该定期改变游戏规则,以浪费脚本编写者的时间。最终,我们希望脚本编写者会厌倦这个游戏并转向其他地方。

最后一个建议:当收到主页请求时,将其放入队列,并在单独的进程中按顺序响应请求(您可能需要对Web服务器进行修改/扩展才能实现此操作,但这很有价值)。如果同一IP /代理的另一个请求在第一个请求排队时进入,请忽略它。这应该可以自动从机器人卸载负载。

编辑:除了使用图像之外,另一个选择是使用javascript填充购买/不购买文本;机器人很少解释javascript,所以他们看不到它。


1
我会确保“默认文本”也会更改。这将防止网络爬虫仅将图像与先前的图像进行比较并等待显着变化。+1。好主意。 - Frank Krueger
1
对“最终建议”的修改:如果在同一地址的先前请求仍未处理时,又有一个来自该地址的第二个请求,则丢弃第一个请求,将第二个请求放入队列中。这将作为针对频繁刷新网站而非等待页面加载的惩罚措施。 - Dave Sherohman
@StevenA.Lowe 我了解,你是对的,我们不能控制其他人的行动,但是我们可以通过代码、创新和非传统思维/编码来控制他们的影响和他们实现预期请求的能力。 - Erx_VB.NExT.Coder
@Erx_VB.NExT.Coder:祝你好运;记得在过程中不要让网站难以使用。;) - Steven A. Lowe
@StevenA.Lowe ...需要资金来推出,所以当我完成开发后,tineye.com决定立即推出,并在其现有服务的基础上免费提供(gulp)你可以想象接受它是多么困难,但是我克服了它,学到了很多东西,仍然有代码可以让我惊叹lol。但我的观点是,许多人说这是不可能完成的,认为这是不可能的等等...我听到的次数比我想象的还要多,但不仅是可能的,而且甚至可以在不存储整个图像(仅存储其中的一小部分)的情况下实现,而且可以进行调整大小、裁剪、修改等操作... - Erx_VB.NExT.Coder
显示剩余13条评论

31

我不知道这个方案有多可行:...采取攻势。

找出机器人正在扫描的数据。在你不销售废物时给它们需要的数据,以一种不会困扰或混淆人类用户的方式。当机器人触发第二阶段时,它们将登录并填写购买$100的“roombas”表格而不是“BOC”。当然,这假设机器人不是特别强大。

另一个想法是,在“bag o crap”销售期间实施随机降价。当你明确表示它只值$20时,谁会花$150来买一个随机的废物袋呢?除了过度热衷的机器人之外,没有人。但是9分钟后它就变成了$35 美元……然后17分钟后就变成了$9美元。或者其他什么的。

当然,僵尸国王们会有所反应。重点是让他们的错误变得非常昂贵(并且让他们为与您的战斗付费)。

所有这些都假定您想惹怒一些机器人领主,这可能并不完全明智。


不认为惹恼机器人领主是可取的,但你这里有一个有趣的想法。 - Shawn Miller
7
我同意,而且我喜欢这个重复的想法——欺骗机器人购买虚假商品。这是报复,而且因为它们已经违反了服务条款,所以它们几乎不能抱怨。 - Blank

22

问题似乎是这样的:机器人想要他们认为价值高但价格低廉的"垃圾袋"。您有时会提供此物品,然后机器人潜伏等待看是否可用,然后购买该物品。

由于似乎机器人所有者正在获利(或有可能获利),所以诀窍在于通过鼓励他们购买垃圾袋使其无利可图。

首先,始终提供"垃圾袋"。

第二,确保垃圾通常是垃圾。

第三,经常轮换垃圾。

简单吧?

您需要在提供旁边放置一个永久的"为什么我们的垃圾有时是垃圾?"的链接,向人类解释发生了什么。

当机器人看到有垃圾并且自动购买该垃圾时,接收者将非常沮丧,因为他们支付了$10美元却只得到了一根断了的牙签,接着是一个空垃圾袋,然后是您鞋底下的污垢。

如果他们在相对短的时间内购买了足够多的这些垃圾(并且您在各个地方都有大量声明解释为什么要这样做),他们将在您的"垃圾袋"上失去公平的一笔"现金"。即使是他们的干预(检查确保垃圾不是垃圾)也可能会失败,如果您经常轮换垃圾的话。甚至机器人可能会注意到并拒绝购买轮换时间太短的任何物品,但这意味着人类将购买非垃圾。

您的常规客户可能会觉得很有趣,因此您可以将其转化为巨大的营销胜利。开始发布售出的"垃圾"数量。人们会回来看看机器人受到了多少打击。

更新:我预计您可能会接到一些投诉电话。我认为您无法完全停止这种情况。但是,如果这杀死了机器人,您可以随时停止并重新启动它。


18
  1. 向非脚本人士出售物品。

  2. 确保网站运行速度不会被机器人减慢。

  3. 不要让“正常”的用户完成任何任务以证明他们是人类。

也许你不想听这个,但第1和第3点是互相排斥的。

在互联网上,没有人知道你是一只狗

好吧,没有人知道你是机器人。没有编程方式可以判断连接的另一端是否有人类而不需要对该人进行验证。防止脚本/机器人在Web上执行操作是CAPTCHA产生的原因。这不是一个新问题,已经投入了大量精力来解决它。如果有更好的方法,不需要像CAPTCHA那样给真正用户带来麻烦,每个人都会使用它。

我认为您需要面对这样一个事实:如果您希望使机器人远离您的订购页面,则好的CAPTCHA是唯一可行的方法。如果对您的产品需求足够高,人们愿意采取这些措施来获取它,那么合法用户不会被CAPTCHA拦住。


如果他们想要,+1 是不会阻止他们的,验证码也一样...还有那个卡通。 - Martin

14
Woot采取的解决这一问题的方法是直接改变游戏。当他们推出一个非常抢手的商品时,他们让用户玩一个视频游戏才能购买它。这不仅成功地防止了机器人(他们可以轻松地对游戏进行微小的更改以避免自动玩家,或者为每个销售提供一个新游戏),而且还给用户留下了“赢得”所需物品的印象,同时也减缓了订单流程。
虽然仍然很快就会售罄,但我认为解决方案很好-重新评估问题并改变参数导致了成功的策略,而纯粹的技术解决方案根本不存在。
你的整个业务模型都基于“先来先服务”。你不能像广播电台那样做(他们不再让第一个打电话的人成为赢家,而是让第5,20或13个打电话的人成为赢家)-这与你的主要特点不相符。
没有办法在不改变真正用户的订购体验的情况下实现这一点。假设您实施所有这些战术。如果我认为这很重要,我只需找到100个人与我合作,在我们的100个单独的计算机上构建软件,并以每秒20次(每个用户/ cookie /帐户/IP地址之间的访问间隔为5秒)的速度访问您的网站。
你有两个阶段:
1.观看首页 2.下订单
你不能通过放置验证码来阻止第一步-这会失去真正的客户(“什么?我每次想看最新的woot都必须解决验证码?”)。因此,我的小团队一起观察,按时间安排,以便我们每秒进行约20次检查,谁先看到变化就自动通知其他人,他们再次加载前一页,跟随订单链接,并执行交易(除非您实施验证码并且为每个wootoff/boc更改它)。您可以在#2之前放置验证码,虽然您不愿意这样做,但这可能是确保即使机器人监视首页,真正的用户也能获得产品的唯一方法。
但是,即使有验证码,我的100个小团队仍然会有显着的先发优势 - 没有办法告诉您我们不是人类。如果您开始计时我们的访问,我们只会添加一些抖动。我们可以随机选择要刷新哪台计算机,以便访问顺序不断变化 - 但看起来仍然足够像人类。
首先,摆脱简单的机器人
您需要拥有自适应防火墙,它将监视请求,如果有人正在做明显的愚蠢之举-在同一个IP上每秒刷新超过一次,那么就采取策略来减缓他们(丢弃数据包,发送拒绝或500错误等)。
这应该会显着降低您的流量并改变机器人用户采用的策略。
第二,使服务器极速运行
您真的不想听到这个...但...
我认为您需要从底层开始的完全定制解决方案。
您不需要混乱的TCP/IP堆栈,但您可能需要开发一个非常、非常、非常快速的定制服务器,该服务器专门用于关联用户连接并适当地对抗各种攻击。
Apache,lighthttpd等都非常灵活,但您运行一个单一目的的网站,您真的需要能够做更多当前服务器无法处理的事情(在处理流量和适当地 Bekämpfung von Bots)方面。通过在自定义服务器上提供一个基本静态的网页(大约每30秒更新一次),你不仅可以处理10倍于平时的请求和流量(因为服务器除了获取请求、从内存中读取页面到TCP/IP缓冲区之外没有其他操作),而且还可以获得一些有助于减缓机器人攻击的指标。例如,通过将IP地址相关联,您可以简单地阻止每秒超过一个连接的IP。人类无法比那更快,即使使用相同的NAT IP地址的人也很少被阻止。你需要进行缓慢的阻塞- 在官方终止会话之前完全保持连接一秒钟。这可以输入到防火墙中,以给予特别恶劣的行为者更长时间的阻塞。

但现实是,无论你做什么,当机器人由人类定制用于单一目的时,无法区分人类和机器人。机器人只是人类的代理。

结论

说到底,在查看前端页面时,你无法区分人类和计算机。你可以在订单步骤停止机器人,但机器人用户仍然具有先发优势,而你仍然需要管理巨大的负载。

你可以添加针对简单机器人的阻止措施,这将提高门槛,并减少人们的麻烦。可能就足够了。

但是,如果不改变您的基本模型,那么您将无法成功。您能做的最好的事情是处理简单的情况,使服务器速度如此之快,以至于常规用户没有注意到,并出售大量商品,即使有数百万个机器人,只要需要它们的常规用户都可以获得它们。

您可能考虑设置一个蜜罐,并将用户帐户标记为机器人用户,但这将引起巨大的负面社区反弹。

每当我想到“好吧,那么做这个......”,我总是可以用合适的机器人策略来反驳它。

即使你在首页设置验证码以便打开订购页面(“该商品的订购按钮是蓝色的带粉红色闪光,在此页面某处”),机器人只需打开页面上的所有链接,然后使用其中任意一个包含订购页面的链接。这根本无法解决问题。

要加快服务器速度,在订购页面添加reCaptcha(我发现这是唯一一个不能轻易被欺骗的方法,但对于您的应用程序来说速度可能太慢了),并考虑略微调整模型,使得普通用户与机器人用户具有同样的几率。

-Adam


每次我想到一个“好的,那么做这个怎么样…”的想法时,我总是能够用适当的机器人策略来反驳它。当我设计我的身份验证系统时,我得出了同样的结论,但是——这里有一个不同之处,让我对这种逻辑产生了怀疑:误报并不是一个大问题。 - Jens Roland
例如,如果有一些真实用户偶尔无法获得特别优惠,那其实并不是什么大问题(只要他们不知道自己错过了什么)。但在认证系统中,这却是个致命问题 - 你不希望用户被阻止登录。 - Jens Roland
这意味着,您可以设计Woot系统比“传统”的反垃圾邮件对策更为严格,因此,您实际上可能能够有效地挫败机器人。 - Jens Roland
然而,现在我再仔细想了想,我无法想出一种既有效又能防止分布式/僵尸网络攻击的方法。 - Jens Roland

12

无论纳粹认为他们的通信有多安全,盟军经常会破解他们的消息。无论你如何试图阻止机器人使用你的网站,机器人所有者都会找到一种绕过它的方法。如果这让你成为纳粹,我很抱歉 :-)

我认为需要不同的思维方式

  • 不要试图阻止机器人使用你的网站
  • 不要选择立即有效的修复方案,而是玩长远游戏

进入这样的思维模式:无论你的网站客户端是人还是机器人,两者都只是付费客户;但其中一个比另一个具有不公平的优势。一些社交生活不太丰富(隐士)的用户可能会像机器人一样让你网站的其他用户感到烦恼。

记录你发布报价的时间和账户选择购买的时间。

这可以让你记录客户购买商品的速度。

变化每天发布报价的时间。

例如,有一个3小时的时间窗口,开始于某个不起眼的时间(午夜?)。只有机器人和隐士会不断刷新页面3个小时,以便在几秒钟内下订单。永远不要改变基础时间,只改变窗口大小。
随着时间的推移,一个画面将浮现出来。
01:您可以看到哪些账户经常在产品上线后的几秒钟内购买产品。这表明它们可能是机器人。
02:您还可以查看用于报价的时间窗口,如果窗口为1小时,则一些早期买家将是人类。然而,人类很少会刷新4个小时。如果发布/购买之间的经过时间在窗口持续时间内相当一致,则那是一个机器人。如果发布/购买时间对于小窗口很短,对于大窗口变长,则那是一个隐士!
现在,您不仅可以阻止机器人使用您的网站,而且还有足够的信息告诉您哪些账户肯定是由机器人使用的,哪些账户可能被隐士使用。您对此信息的处理取决于您,但您肯定可以使用它使您的网站更加公平,让有生活的人受益。

我认为禁止机器人账户是没有意义的,这就像打电话给希特勒说“谢谢你的潜艇位置!”一样。你需要以某种方式使用信息,让账户所有者不会意识到。让我们看看我能否想出什么办法......

在队列中处理订单:

当客户下订单时,他们会立即收到确认电子邮件,告诉他们订单已经排队,并在处理完成后通知他们。我在亚马逊上体验过这种订单/发货情况,这并不影响我,只要我立即收到一封电子邮件告诉我亚马逊知道我想要这本书就可以了。在你的情况下,这将是以下电子邮件:

  1. 您的订单已经下达并在队列中。
  2. 您的订单已经处理。
  3. 您的订单已经发货。

用户认为他们处于公平的队列中。每隔1小时处理一次队列,以便普通用户也能体验到队列,以免引起怀疑。只有在机器人和隐士账户在队列中等待“平均人类下单时间+x小时”后才处理订单。有效地将机器人变成人类。


啊,谢谢 :-) 我提到纳粹是因为我对布莱切利园的二战故事非常感兴趣 :-)有些破译消息的故事采用了不同的思维方式来解决问题,比如假设操作员懒得改变前一晚的密码 :-) - Peter Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接