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


489

我已经接受了答案,但可悲的是,我相信我们会坚持我们最初的最坏情况:每个人都在尝试购买废话。简短说明:缓存/ Web场使无法跟踪命中,并且任何解决方法(发送非缓存的Web信标,写入统一表等)都会使网站的速度比僵尸程序慢。思科提供的一些昂贵的硬件或类似产品可能可以提供较高的帮助,但是如果将每个人都验证码作为替代方案,则很难证明其成本合理。稍后,我将尝试进行更详细的解释,并为以后的搜索者进行清理(尽管欢迎其他人尝试,因为它是社区Wiki)。

情况

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

可用性是我工作的重要部分,而使网站令人兴奋和有趣则是其余的大部分。这就是以下三个目标的来源。CAPTCHA损害了可用性,并且机器人从我们的垃圾销售中窃取了乐趣和兴奋。

僵尸程序在第二次屏幕抓取(和/或扫描我们的RSS)以随机垃圾销售的形式猛烈抨击了我们的首页。他们看到的那一刻,它触发程序的第二阶段登录,单击“我想要的”,填写表格,然后购买废话。

评价

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

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

因此,我们将返回到IP扫描,a)在这个云网络和垃圾邮件僵尸时代,这是相当无用的; b)鉴于来自一个IP地址的企业数量,捕获了太多的无辜者(更不用说与之相关的问题了)非静态IP ISP和潜在的性能损失,以试图对此进行跟踪)。

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

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

 

lc再一次:“当然,除非炒作是您的营销计划的一部分。” 是的,肯定是。物品出现的惊奇程度,以及设法获得一件物品的兴奋程度,可能与最终得到的废话一样重要或更重要。消除先到先得的一切都会不利于赢得“垃圾”的快感。

 

novatrust:我首先欢迎我们的新机器人霸主。实际上,我们确实提供RSSfeed,以允许第三方应用程序扫描我们的网站上的产品信息,但不能扫描主要网站的HTML。如果我的解释正确,那么您的解决方案确实会通过完全牺牲目标1来解决目标2(性能问题),而只是放弃了机器人将购买大部分废品的事实。我赞成您的回答,因为您的最后一段悲观主义对我来说很准确。这里似乎没有银弹。

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

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

原始问题

假设您要出售的东西具有很高的感知价值,而价格却非常有限。没有人确切知道您何时会出售该物品。经常有超过一百万的人过来看看您要卖的东西。

您最终会遇到脚本编写者和机器人程序,他们试图以编程方式[a]弄清楚您何时出售该商品,[b]确保它们是第一个购买该商品的人。这很烂,原因有两个:

  1. 您的网站遭到非人类的猛烈抨击,使所有人的工作速度减慢。
  2. 脚本编写者最终“赢得”了产品,使常客感到被骗。

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

  • 用户体验很糟糕,因为他们必须破译CAPTCHA,挑选猫或解决数学问题。
  • 如果感觉到的好处足够高,而人群又足够多,那么一些人就会在任何调整中找到自己的出路,导致军备竞赛。(特别简单的调整是正确的;隐藏的“注释”表单,重新排列表单元素,给它们贴错标签,隐藏的“陷阱”文本都将一次起作用,然后需要进行更改以针对此特定表单进行战斗)
  • 即使脚本编写者无法“解决”您的调整,也不会阻止他们猛击您的首页,然后发出警报,要求脚本编写者手动填写订单。如果他们从解决[a]中获得优势,他们将很可能仍然会赢得[b],因为他们将是第一个进入订单页面的人。此外,1.仍然会发生,导致服务器错误并降低每个人的性能。

另一个解决方案是监视IP击中次数过多,将其从防火墙中阻止或以其他方式阻止其排序。这可以解决2.并防止[b],但是扫描IP会对性能造成巨大影响,并且可能比脚本编写者自己引起的问题更多,例如1.。此外,云网络和垃圾邮件僵尸的可能性使IP检查变得毫无用处。

第三个想法,迫使订单被加载一段时间(例如半秒钟),可能会减慢快速订单的进度,但是同样,脚本编写者仍然是第一批加入该订单的人,无论以何种速度都不会实际用户。

目标

  1. 将该项目出售给没有脚本的人。
  2. 保持网站的运行速度不受机器人的影响。
  3. 不要为了完成“正常”用户的任务而烦恼他们,以证明他们是人类。

1
我认为您的目标相互矛盾:保持原样的体验,但要摆脱僵尸程序。我认为您不能在不牺牲另一部分的情况下获得其中的一部分。
最多

这是一个社区Wiki,因此可以随意尝试,但是我主要是想尽可能清楚地涵盖每一个要点,因为我认为可以尝试的一些明显的东西我们已经尝试过并打折扣。
Dave Rutledge,2009年

为什么不缓存重复犯规者,而只是不更新​​他们重复请求的页面。IPv4和MAC地址总计为32 + 48位。对于100万用户而言,这是10MB,这不是问题。IPv4和MAC的组合应该可以帮助您更准确地跟踪各种用户
John Leidegren 2009年

4
我真的不明白为什么需要让匿名用户看到废话。为什么不仅将其提供给已登录的用户?如果这样做的话,就不会有不知名的用户经常点击该页面,然后就可以禁止不良用户。
Ryan Guill

1
我认为有些人在这里缺少一个关键因素:这些机器人也可以登录并购买。他们确实知道一个有效的帐户并可以登录。此外,使用woot的真实人员会在有物品出现的那一刻坐在那里,然后每2-5秒按F5键重新加载一次。那是正常的人类正常使用。
CodingWithSpike

Answers:


229

验证码如何实现类似的内容?

如果您正常使用该网站,则可能永远都看不到。如果您碰巧过于频繁地重新加载同一页面,过快地发布连续的注释或其他触发警报的内容,则使它们证明它们是人为的。在您的情况下,这可能是对同一页面的不断重载,快速跟踪页面上的每个链接,或者填写的订单太快以至于无法人工操作。

如果它们连续x次未通过检查(例如2或3),请给该IP超时或采取其他措施。然后,在超时结束时,将它们再次转回支票。


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

至于捕获到太多无辜者,您可以在人工检查页面上放置免责声明:“如果有太多匿名用户从同一位置查看我们的网站,则也会显示此页面。我们建议您注册或登录以避免这个。” (适当调整措辞。)

此外,X人同时从一个IP加载相同页面的几率是多少?如果它们过高,则可能需要针对机器人警报的其他触发机制。


编辑:另一个选择是,如果它们失败太多次,并且您对产品的需求有信心,可以阻止它们,并让他们亲自致电您删除该阻止。

打电话给人们似乎确实是一种愚蠢的做法,但是它可以确保计算机后方有人。关键是只有在除非是机器人的情况下才应该在几乎不会发生的条件下放置该块(例如,连续多次失败检查)。然后,它迫使人类互动-拿起电话。

为了回应让他们给我打电话的评论,显然这里需要权衡。您是否担心让您的用户像人一样在出售时接听几个电话?如果我非常担心产品会吸引人类用户,那么我就必须做出这个决定,也许会牺牲我一小部分的时间。

由于您似乎决心不让漫游器抢占您的网站,所以我相信电话可能是个不错的选择。由于我无法从您的产品中获利,因此我对接收这些电话没有兴趣。如果您要分享一些利润,但是,我可能会感兴趣。由于这是您的产品,因此您必须决定要关心多少并相应地实施。


释放障碍的其他方式效果不佳:超时(但它们将不得不再次重击您的网站,反复冲洗),超时(如果确实是人在尝试购买您的产品,他们将是SOL并因未通过检查而受到惩罚),电子邮件(由漫游器轻松完成),传真(相同)或蜗牛邮件(花费的时间太长)。

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


13
Google使用相同的方法,只有IP地址可以使用。在工作中,我经常会先获得一个验证码,然后才能在Google上进行搜索,因为他们会从相同的IP地址看到类似机器人的行为。我认为这种方法(类似bot行为后的CAPTCHA)是最好的方法。
罗斯,

7
我曾经有Google要求我提供验证码,但这是我自己的错-我将它们用作计算器,做了几十个几乎相同的总和。
Marcus Downing

CAPTCHA选项听起来像是我的赢家。您会严重伤害机器人,如果平衡得当,就永远不会以合法用户的方式进入。
xan

您可以生成一个临时电子邮件地址(例如cur92Siva@site.com),而不是将人们拒之门外并使用电话,但使用图像生成前部。
山姆

除非僵尸程序刚刚习惯系统并且可以在屏幕上抓取电子邮件地址,否则这也可能会起作用。我对电话的观点是,它实际上迫使人们进行互动,并要求用户用自己的声音直接解释自己。Bot所有者可能不想这样做。
lc。

193

您需要找到一种方法使机器人购买价格过高的东西:12毫米小花生:20美元。在脚本编写者决定您对它们进行游戏之前,请查看有多少个机器人抢购了。

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


12
如果他们随后退还这些物品或发出退款,该怎么办?这可能最终使您付出成本,并且退款处理可能会损害使用信用卡处理器的业务。僵尸程序也很可能使用被盗的卡,但是由于更高的金额会更频繁地受到挑战,因此这可能会加剧拒付的水平。
大平方

13
不要向他们收费,而是将其标记为机器人,专门用于尝试购买该商品。如果有人买了一个电话物品,那就把它们标记为机器人,并禁止它们。您可能只将它们锁定了几个小时。
Kibbee

4
这具有严重的喜剧价值,直到您激怒了一个脚本小子,而这个小子恰巧拥有比仅仅刮的更多技能,并且因为您将他扯下而导致了真正的问题。
MattBelanger

2
如果剧本小子生气了,他们可能只会暴露自己,让您标记它们并将其移交给执法部门。
雅科

9
sqook:这不是技术解决方案,而是现实世界的解决方案。把保安人员拿着枪放在银行里是一回事。它看起来似乎很刻薄,但骗子也是如此,所以刻薄。伤害他们直到受伤为止。
Christopher Mahan

162

我的解决方案是通过为机器人和脚本添加大约10分钟的延迟来使屏幕抓取毫无价值。

这是我的处理方式:

  • 记录并识别任何重复击球手。

您无需在每次匹配时都记录每个IP地址。每20个左右的命中中仅跟踪一个。重犯者仍会出现在随机的临时跟踪中。

  • 保留大约10分钟前的页面缓存。

  • 当重复造访者/漫游器访问您的网站时,请为他们提供10分钟的旧缓存页面。

他们不会立即知道他们正在获得旧站点。他们将能够获得全部胜利,但是他们再也不会赢得任何比赛,因为“真正的人”将有10分钟的领先优势。

优点:

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

缺点

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

你怎么看?


1
该死的。我只花了一个半小时编写自己的五向量方案来讨价还价,并且在认真思考了我的第五个对策(僵尸网络节流阀)后,我不得不承认失败。没用 而我一个小时的解决方案的其余部分是-这个。abelenky,我向您致敬
Jens Roland

7
基于此的基础:将IP放入内存中的LRU计数哈希(每次IP返回时递增并推入顶部)。根据反向IP信息,活动,图像/ js / cookie下载添加启发式方法。通过攻击的严重程度来扩展您的响应,最大程度地减少误报的后果。
SquareCog

1
(续:)而且我的技术并没有阻止或禁止任何人。它只是给他们延迟的信息。办公室中没有人可以获奖,但是从客户服务/可访问性的角度来看,这并不是什么大问题。
abelenky

18
@bruceatk:如果给他们一个特殊的仅机器人页面,他们最终将学会检测它,并学会更准确地欺骗普通客户。通过提供旧页面,他们将没有任何想法要接收旧数据。旧数据是合法的!对于比赛/比赛目的,它只是没有用。
abelenky

1
非常感谢那些支持我的想法的人。尽管悬赏金已经结束,但我认为这个想法有很多优点,因为它比验证码更易于实施,更不会骚扰人类,更可能挫败机器人。我希望有人在某些网站上尝试一下。
abelenky

54

请看ned Batchelder的这篇文章。他的文章是有关阻止垃圾邮件的,但相同的技术可以轻松地应用于您的网站。

我们可以通过使人们难以发表成功的文章,或者通过使他们无意中将自己标识为机器人来阻止机器人,而不是通过让人们识别自己来阻止机器人。这消除了人们的负担,并使评论表单没有可见的反垃圾邮件措施。

此技术是我防止在此站点上出现垃圾邮件的方法。有用。这里描述的方法根本不看内容。

其他一些想法:

  • 创建一种正式的自动通知机制(RSS feed?Twitter?),人们可以在您的产品上市销售时进行订阅。这减少了人们制作脚本的需要
  • 新产品上市之前,请更改迷惑技术。因此,即使编剧可以升级军备竞赛,他们也总是落后一天。

编辑:要完全清楚,内德的上述文章介绍了通过防止BOT通过表单提交订单来防止商品自动购买的方法。他的技术对于防止机器人屏幕抓取主页以确定“ Bandoleer of Carrots”何时上市销售没有用。我不确定是否确实可以阻止THAT。

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

微调框是一个用于以下用途的隐藏字段:它将多个值哈希在一起,以防止篡改和重播,并且用于隐藏字段名称。微调框是以下内容的MD5哈希值:

  • 时间戳记
  • 客户的IP地址,
  • 被评论的博客条目的条目ID,以及
  • 一个秘密

这是您可以在WOOT.com上实现的方法:

每次新商品上市时,更改用作哈希一部分的“秘密”值。这意味着,如果有人要设计一个BOT来自动购买物品,它将仅在下一个物品上市之前有效

即使有人能够快速重建其漫游器,其他所有实际用户也已经购买了BOC,并且您的问题已得到解决!

他讨论的另一种策略是不时更改蜜罐技术(同样,在新产品上市时更改它):

  • 使用CSS类(当然是随机的)来设置字段或包含元素来显示:无。
  • 用与页面背景相同(或非常相似)的字段来上色。
  • 使用定位将字段移出页面的可见区域。
  • 将元素设置得太小而无法显示其中包含的蜜罐字段。
  • 使字段可见,但使用定位用模糊的元素覆盖它们。
  • 使用Javascript可以实现所有这些更改,从而要求漫游器具有完整的Javascript引擎。
  • 保持显示的蜜罐像其他字段一样,但要告诉人们不要在其中输入任何内容。

我想我的总体想法是在每个新商品上市时更改表格设计。或者至少在新BOC上市时进行更改。

每月几次几次?

如果您接受此答案,请问您是否应该在下一个到期时通知我?:)


+1为RSS。做到这一点,以便合法用户得到奖励。
Marcus Downing

RSS似乎是一个很好的解决方案,但是这是否可能会损害我猜该网站所依赖的广告收入?
TM。

1
我不太了解“旋转”概念。这只是放置在html中<form>并在提交时发送的额外数据吗?因为机器人也可以轻松抓取。
Ponkadoodle

44

问:如何阻止脚本编写者每秒对您的网站进行数百次抨击?
答:你不知道。无法通过外部代理阻止这种行为。

您可以采用多种技术来分析传入的请求,并尝试尝试确定谁是人类,或者不是人类……但这会失败。最终,如果不是立即。

唯一可行的长期解决方案是更改游戏规则,以使该网站不适合漫游器使用,或者对脚本编写者不那么有吸引力。

你是怎样做的?好吧,这是一个不同的问题!;-)

...

好的,上面已经给出(拒绝)了某些选项。我只看过一次您的网站,并不十分熟悉,但是由于人们可以阅读图像中的文本,而机器人无法轻松地做到这一点,因此请将公告更改为图像。不是验证码,而是一张图片-

  • 请求页面时生成图像(当然是缓存的)
  • 保持图片来源名称相同,以免影响游戏的进行
  • 大多数情况下,图像中会包含普通文本,并且会对齐以显示为嵌入式HTML页面的一部分
  • 当游戏“开启”时,图像更改为公告文本
  • 公告文本显示了必须手动输入的URL和/或代码才能获得奖品。如果需要,请验证代码,但这可能不是必需的。
  • 为了提高安全性,该代码可以是专门为请求/ IP /代理生成的一次性令牌,以便重复的请求生成不同的代码。或者,如果按需生成的代码过于繁琐,则可以预先生成一堆随机代码(一次性填充)。

运行真实的人对此的时间试用,并以比(说)一半时间更快的速度忽略(“糟糕,发生了错误,抱歉!请重试”)。此事件还应向开发人员发出警报,指出至少有一个机器人已经弄清了代码/游戏,因此该更改代码/游戏了。

即使没有机器人触发,也要定期定期更改游戏,只是浪费脚本编写者的时间。最终,脚本编写者应该对游戏感到厌倦并转到其他地方...我们希望;-)

最后一条建议:当对您的主页的请求进入时,将其放入队列中并在一个单独的过程中依次响应请求(您可能必须修改/扩展Web服务器才能执行此操作,但是可能值得)。如果第一个请求在队列中时来自同一IP /代理的另一个请求进入,则将其忽略。这将自动减轻机器人的负担。

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


1
我会确保“默认文本”也会更改。这样可以防止抓取应用仅将图像与之前的图像进行比较并等待重大更改。+1。好点子。
Frank Krueger,2009年

1
对“最终建议”的修正:如果第二个请求来自某个地址,而来自同一地址的前一个请求未决,则丢弃第一个请求并将第二个请求放入队列。这将成为锤打网站而不是让页面加载的惩罚。
戴夫·谢罗曼

@ [弗兰克·克鲁格]:我以为我暗示了这一点,但是重新阅读后我想我没有-谢谢指出!将默认文本图像更改为几个像素以使比较混乱,和/或生成几乎不可见的水印样式的文本以进一步使机器人混乱也可能是有用的
Steven A. Lowe 2009年

@ [Dave Sherohman]:可以,但这可能导致队列混乱;最好只是丢弃新请求以立即减轻负载,这可能会更好-测试/配置文件可以肯定哪个更好,但是感谢您的建议!
Steven A. Lowe

您不能忍受您让他基本上屈服,我知道您认为这是不可能的,但我不同意。如果有意愿,总有办法。如此轻松地允许失败确实令人振奋和悲伤,如果折纸海报正在阅读,则可以这样做,但是解决方案需要在对流量日志进行分析之后进行定制设计,您可以防止当前的方法并在将来进行证明以防止未使用的方法。同样是JavaScript,webbrowser控件可以实时运行JavaScript,不需要其他引擎-它们可以与Dom混淆并运行自己的JavaScript!Opps
Erx_VB.NExT.Coder 2012年

30

我不知道这是多么可行:...继续进攻。

找出机器人正在扫描的数据。当您不出售垃圾时,向他们提供他们正在寻找的数据。以不会打扰或迷惑人类用户的方式来执行此操作。当漫游器触发第二阶段时,他们将登录并填写表格以购买$ 100的Roombas而非BOC。当然,这是假设漫游器不是特别健壮。

另一个想法是在垃圾销售期间的整个过程中实现随机的价格下降。当您清楚地指出这只值20美元时,谁会花150美元购买一个随机的垃圾袋?除了狂热的机器人之外,没有其他人。但随后9分钟后,这是35美元……然后17分钟后,这是9美元。管他呢。

当然,僵尸国王将能够做出反应。关键是要使他们的错误对他们造成极大的损失(并使他们付钱给您抗击)。

所有这些都假设您想惹恼一些机器人大王,这可能不是100%明智的。


不要认为生气机器人主人是可取的,但是您在这里有一个有趣的想法。
肖恩·米勒

7
我同意,我喜欢这种重复的想法,即欺骗机器人进行虚假购买。这是回报,而且由于他们已经打破了ToS,因此他们几乎不会抱怨。
尼古拉斯·弗林特

22

因此问题实际上似乎是:机器人想要他们的“袋装垃圾”,因为它以较低的感知价格具有较高的感知价值。您有时会提供此商品,而机器人则潜伏着,等着看是否有货,然后他们购买。

由于机器人所有者似乎正在赚钱(或可能在赚钱),所以诀窍是通过鼓励他们购买废话使它们对他们无利可图。

首先,始终提供“ bag'o废话”。

其次,请确保通常是胡扯。

第三,经常旋转废话。

简单,不是吗?

您将需要一个永久的“为什么我们的垃圾有时会垃圾?” 报价旁边的链接,向人们解释发生了什么事。

当漫游器看到有垃圾并且自动购买了垃圾时,接收者会非常沮丧,因为他们为碎牙签支付了10美元。然后是一个空的垃圾袋。然后鞋子底部有一些污垢。

如果他们在相对较短的时间内购买了足够的垃圾(并且您到处都有大量的免责声明,说明您这样做的原因),那么他们将在您的“袋”废话”。如果您经常轮换废话,即使是人工干预(检查以确保废话不是废话)也可能失败。哎呀,也许机器人会注意到并且不会购买任何时间太短的东西,但这意味着人类会购买非废话。

哎呀,您的常规客户可能会很开心,您可以将其转变为巨大的营销胜利。开始发布正在出售的“ c废”鲤鱼数量。人们会回来只是为了看看机器人被咬了有多难。

更新: 我希望您可能会提前接到一些抱怨的电话。我认为您无法完全阻止这一点。但是,如果这杀死了机器人,则可以随时将其停止并稍后重新启动。


15
  1. 将该项目出售给没有脚本的人。

  2. 保持网站的运行速度不受机器人的影响。

  3. 不要为了完成“正常”用户的任务而烦恼他们,以证明他们是人类。

您可能不想听这个,但是#1和#3是互斥的。

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

嗯,没人知道你也是机器人。没有编程的方式可以告诉连接的另一端是否有人,而不需要该人做某事。防止脚本/机器人在网络上运行是发明验证码的全部原因。并不是说这是一个新问题,尚未花费很多精力。如果有更好的方法可以做到这一点,而不会像CAPTCHA那样给真实用户带来麻烦,那么每个人都已经在使用它了。

我认为您需要面对这样一个事实,即如果您想让机器人不在您的订购页面上,那么好的验证码是唯一的方法。如果对您的随机垃圾的需求足够高,以至于人们愿意花这么多钱来获取,那么合法用户将不会被验证码所拖延。


+1,如果他们想要的话,验证码不会阻止他们……还有动画片。
马丁

13

Woot用来解决此问题的方法正在改变游戏-从字面上看。当他们展示出非常理想的商品进行销售时,他们会让用户玩视频游戏以订购该产品。

这不仅可以成功对抗机器人(他们可以轻松地对游戏进行微小的改动以避免自动玩家,甚至可以为每次销售提供新游戏),而且还给用户留下了“赢得”所需物品的印象,同时放慢了速度订购过程。

它仍然很快就销售一空,但是我认为解决方案很好-重新评估问题并更改参数导致成功的策略,而严格的技术解决方案根本就不存在。


您的整个业务模型都基于“先到先得”的原则。您无法做广播电台所做的事情(它们不再使第一个呼叫者成为获胜者,它们使第5个呼叫者,第20个或第13个呼叫者成为获胜者)-它与您的主要功能不匹配。

不,没有办法改变真实用户的订购体验。

假设您实施了所有这些策略。如果我认为这很重要,那么我只会让100个人与我一起工作,我们将构建可在100台独立计算机上使用的软件,并每秒访问您的网站20次(每个用户/ Cookie /帐户/ IP地址)。

您有两个阶段:

  1. 观看首页
  2. 定购

您不能放置验证码#1-这会失去真正的客户(“什么?每次我想看到最新的求助信息时,我都必须解决验证码?!”)。

因此,我的小组进行监视,计时在一起,这样我们每秒可获得约20张支票,而谁先看到更改会自动提醒所有其他人,谁会再次加载首页,点击订单链接并执行交易(除非您实施验证码并为每个wootoff / boc进行更改,否则这也可能会自动发生。

您可以将验证码放在#2的前面,而当您讨厌这样做时,这可能是确保即使漫游器监视首页还是真实用户都能获得产品的唯一方法。

但是即使有了验证码,我的100条小带子仍然具有明显的先发优势-而且您无法断定我们不是人类。如果您开始计时访问,我们只会增加一些抖动。我们可以随机选择要刷新的计算机,以使访问顺序不断变化-但看起来仍然像人一样。

首先,摆脱简单的机器人

您需要有一个自适应防火墙来监视请求,并且如果有人在做明显的愚蠢的事情-在同一个IP上每秒刷新一次以上,然后采用策略将它们放慢(丢弃数据包,发回被拒绝或500个错误等) )。

这将大大减少您的访问量,并改变机器人用户采用的策略。

其次,使服务器快速增长。

你真的不想听这个...但是...

我认为您需要的是从下至上的完全自定义解决方案。

您不需要弄乱TCP / IP堆栈,但是您可能需要开发一个非常非常快的自定义服务器,该服务器专门用于关联用户连接并对各种攻击做出适当的反应。

Apache,lighthttpd等都具有很大的灵活性,但是您运行的是一个单一目的的网站,并且您确实需要具备比当前服务器所能做的更多的功能(既可以处理流量,又可以适当地对抗机器人) )。

通过在自定义服务器上提供一个高度静态的网页(每30秒左右更新一次),您不仅应该能够处理10倍的请求和流量(因为该服务器除了获取请求和读取内容外没有做其他事情)从内存到TCP / IP缓冲区的页面),但它还使您能够访问可能有助于降低机器人速度的指标。例如,通过关联IP地址,您每个IP每秒仅可以阻止多个连接。人类的发展速度不能超过此速度,即使使用相同NAT IP地址的人们也很少会被阻止。您需要做一个缓慢的阻止-在正式终止会话之前,将连接搁置一整秒钟。这可能会进入防火墙,从而对特别严重的罪犯提供长期封锁。

但是现实是,无论您做什么,都没有办法告诉机器人之外的其他人。机器人只是人类的代理。

结论

归根结底,您不能分派人员和计算机来观看首页。您可以在订购步骤中停止漫游器,但是漫游器用户仍然具有先发优势,并且您仍然需要管理大量负载。

您可以为简单的bot添加块,这将提高标准,减少麻烦的人。那可能就足够了。

但是,如果不更改基本模型,您将失去运气。您能做的最好的事情就是照顾一些简单的情况,使服务器变得如此快速,普通用户不会注意到,并且出售如此多的商品,即使您拥有数百万个机器人,只要想要的普通用户都能得到它们。

您可能会考虑设置一个蜜罐并将用户帐户标记为机器人用户,但这会给社区带来巨大的负面影响。

每当我想到“好吧,该怎么办……”,我总是可以使用合适的机器人策略来应对。

即使您将首页设置为可进入订购页面的验证码(“此商品的订购按钮是蓝色的,在此页面的某处是粉红色的闪闪发光”),漫游器也会简单地打开页面上的所有链接,并使用其中的任何一个返回订购页面。那只是赢不了的办法。

使服务器快速运行,在订购页面上放入reCaptcha(我发现这是不容易上当的,但是对您的应用程序来说可能太慢了),然后考虑一下更改模型的方法普通用户和机器人用户一样有机会。

-亚当


“每当我想到一个“好吧,该怎么办……”,我总是可以用一种合适的机器人策略来应对它。”在设计身份验证系统BUT时,我得出了相同的结论-这里有一个区别让我怀疑逻辑:误报不是大问题
詹斯·罗兰

(续)例如,如果这里有一些真实用户无法获得特别优惠,那么这实际上并不是一个大问题(只要他们不知道自己缺少什么)。在身份验证系统中,这一个大问题-您不希望阻止用户登录
Jens Roland 2009年

(续)这意味着,您可以将Woot系统设计为比“传统”垃圾邮件机器人对策更具限制性,因此,您实际上可能能够有效地阻止机器人。
詹斯·罗兰

(但是,现在,我已经有了更多的思考,我想不出一种可行的方法,这也将阻止分布式/僵尸网络的“攻击”)
Jens Roland

11

免责声明:此答案完全与编程无关。但是,它确实首先尝试攻击脚本的原因。

另一个想法是,如果您确实有数量有限的销售量,为什么不从先到先得的方法更改它?当然,除非炒作是您营销计划的一部分。

还有很多其他选择,我敢肯定其他人会想到一些不同的选择:

  • 订购队列(预购系统)-一些脚本可能仍会排在队列的最前面,但是仅手动输入信息可能会更快。

  • 一个抽奖系统(每个要订购一个的人都被输入到系统中)-这样,拥有脚本的人和没有脚本的人一样有机会。

  • 紧急优先队列-如果确实有很高的感知价值,人们可能愿意支付更多。实施订购队列,但允许人们支付更多费用以将其排在更高的位置。

  • 拍卖(这笔钱归David Schmitt所有,评论是我自己的)-人们仍然可以在最后一刻使用脚本进行窥探,但不仅改变了定价结构,人们还希望与其他人抗衡。您还可以执行一些操作来限制给定时间段内的出价数量,让人们提前致电以获取授权码,等等。


1
谢谢。看,我知道还有其他人。
lc。

任何抽奖系统都将超负荷运行,以增加对机器人的青睐的机会
Andy Dent 2009年

如果你不把它限制在每人/家庭/(物理)地址的话,会不会
LC。

11

不管纳粹认为他们的通讯有多安全,盟国经常会打断他们的信息。无论您如何尝试阻止漫游器使用您的网站,漫游器所有者都将找到解决之道。抱歉让您成为纳粹党:-)

我认为需要不同的心态

  • 不要试图阻止漫游器使用您的网站
  • 不要寻求立即可用的解决方案,请长时间玩

进入一种思维模式,即您的站点的客户是人类还是机器人都无关紧要,两者都只是在为客户付费;但是一个相对于另一个具有不公平的优势。一些没有太多社交生活(隐士)的用户可能会像机器人一样惹恼您网站的其他用户。

记录您发布要约的时间和帐户选择购买要约的时间。

这样就可以记录客户购买商品的速度。

更改您发布优惠的时间。

例如,有一个3小时的窗口在一天中某个晦涩的时间开始(午夜?)。只有漫游器和隐士会不断刷新页面3小时,以便在几秒钟内获得订单。切勿更改基准时间,仅更改窗口的大小。

随着时间的流逝,将会出现一幅图画。

01:您可以查看哪些帐户在上线后的数秒内定期购买产品。暗示他们可能是机器人。

02:您还可以查看报价所用的时间窗口,如果该窗口是1小时,那么一些早期购买者将是人类。但是,人类很少会刷新4个小时。如果不管窗口持续时间长短,在发布/购买之间经过的时间都非常一致,那就是机器人。如果小窗口的发布/购买时间短而大窗口的发布/购买时间长,那就是隐士!

现在,您不仅可以阻止僵尸程序使用您的网站,而且还拥有足够的信息,可以告诉您肯定是僵尸程序使用了哪些帐户,隐士可能使用了哪些帐户。您可以根据自己的意愿来处理这些信息,但是您当然可以使用它来使您的网站对有生命的人更加公平。

我认为禁止漫游器帐户是没有意义的,类似于打电话给希特勒并说“谢谢您的U型艇!” 您需要以某种方式使用帐户所有者不会意识到的方式来使用信息。让我们看看我是否可以做任何梦.....

排队处理订单:

当客户下订单时,他们会立即收到一封确认电子邮件,告知他们他们的订单已放入队列,处理完毕后会收到通知。我在Amazon上的订单/发货过程中遇到了这种情况,它一点也没有困扰我,我不介意几天后再收到一封电子邮件,告诉我我的订单已经发送,只要我立即收到一封电子邮件告诉我亚马逊知道我要这本书。在您的情况下,这将是一封电子邮件

  1. 您的订单已下达并且正在排队。
  2. 您的订单已处理。
  3. 您的订单已派出。

用户认为他们处于公平队列中。每1个小时处理一次队列,以使普通用户也能体验到队列,以免引起怀疑。仅当它们进入“平均人工订购时间+ x小时”队列时,才处理bot和hermit帐户的订单。有效减少机器人对人类的危害。


这意味着什么?:-)
彼得·莫里斯

谢谢:-)我提到纳粹的原因是因为我对第二次世界大战有关布莱奇利公园的故事非常感兴趣:-)一些有关如何破坏消息的故事使用了不同的思维方式来解决问题,例如假设操作员过于懒惰以至于无法更改从前一天晚上开始的代码:-)
彼得·莫里斯

10

我说使用API​​公开价格信息。这是不直观的解决方案,但确实可以使您对情况进行控制。给API添加一些限制,使其功能比网站稍差。

您可以对订购进行相同的操作。您可以尝试对API功能/性能进行一些小的更改,直到获得理想的效果。

有代理和僵尸网络可以击败IP检查。验证码阅读脚本非常好。在印度甚至有一些工人以低价击败了验证码。您可以提出的任何解决方案都可能被合理击败。通过将WebBrowser控件或其他模拟浏览器与僵尸网络或代理列表结合使用,甚至Ned Batchelder的解决方案也可以被超越。


8

我们目前正在使用F5的最新一代BigIP负载均衡器来执行此操作。BigIP具有先进的流量管理功能,即使在单个IP背后的一组来源中,也可以基于使用的频率和使用模式来识别刮板和僵尸程序。然后,它可以限制这些内容,为它们提供替代内容,或者只是用标头或cookie对其进行标记,以便您可以在应用程序代码中识别它们。


这是我要提出的确切解决方案,尤其是自动节流。您可以自己滚动,只需依靠一些常规到高级的信号分析即可。
wds

7

首先,让我回顾一下我们在这里需要做的事情。我意识到我只是在解释最初的问题,但重要的是我们必须100%正确,因为有很多很棒的建议可以使4个问题中的2个或3个正确,但是正如我将演示的那样,您将需要一个涵盖所有需求的多方面方法。

要求1:摆脱“机器人猛击”:

头版的快速抨击正在损害您网站的性能,这是问题的核心。“砰砰”声既来自单IP僵尸程序,也可能来自僵尸网络。我们要摆脱两者。

要求2:不要与用户体验混为一谈:

我们可以通过实施令人讨厌的验证程序(例如给人类操作员打电话,解决一堆验证码或类似问题)来非常有效地解决机器人的问题,但这就像强迫每位无辜的飞机乘客为了微小的机会而跳过疯狂的安全箍捕捉最愚蠢的恐怖分子。哦,等等-我们实际上是这样做的。但是让我们看看我们能不能做到这一点上woot.com。

要求3:避免“军备竞赛”:

如您所述,您不想卷入垃圾邮件机器人军备竞赛。因此,您不能使用简单的调整,例如隐藏或混乱的表单字段,数学问题等,因为它们本质上是模糊的度量,可以轻松地自动检测和规避。

要求4:阻止“警报”机器人:

这可能是您最困难的要求。即使我们可以提出有效的人工验证挑战,僵尸程序仍然可以轮询您的首页,并在有新提议时提醒脚本编写者。我们也要使这些机器人不可行。这是第一个要求的更强版本,因为机器人不仅不能发出破坏性能的快速启动请求-它们甚至不能发出足够的重复请求以及时向脚本编写者发送“警报”以赢得胜利报价。


好吧,让我们假设我们能够满足所有四个要求。首先,正如我提到的,没有人可以采取措施。您将必须结合一些技巧来实现它,并且您将不得不消除两个烦恼:

  1. 少数用户将需要跳圈
  2. 少数用户将无法获得特别优惠

我知道这些很烦人,但是如果我们可以使“小”数目足够小,我希望您能够同意积极因素胜过消极因素。

第一步:基于用户的节流:

这很容易,我相信您已经做到了。如果用户已登录,并且每秒保持刷新600次(或其他类似),则您停止响应并告诉他进行冷却。实际上,您可能比这早得多地限制了他的请求,但是您明白了。这样,一旦登录的漫游器开始轮询您的网站,就会被禁止/限制。这是简单的部分。未经身份验证的机器人是我们的真正问题,因此对他们:

第二招:几乎每个人都建议的某种形式的IP节流:

不管是什么,你将不得不做一些基于节流阻挠“机器人砰”的IP。由于对您来说,允许未经身份验证的(未登录)访问者获得特殊优惠对您来说似乎很重要,因此,最初您只能使用IP,尽管它们并不完美,但它们确实可与单IP僵尸程序配合使用。僵尸网络是一种与众不同的动物,但我将再次讨论。现在,我们将做一些简单的调整来击败速射单IP机器人。

如果在所有其他处理之前运行IP检查,将代理服务器用于限制逻辑,并将IP存储在经过memcached查找优化的树结构中,则性能下降可以忽略不计。

第三招:用缓存的响应掩盖节流阀:

随着快速启动的单IP机器人的节流,我们仍然必须解决慢速的单IP机器人。专门调整过的机器人通过将请求间隔开得比节流阻止的位置略远,从而“在雷达下飞行”。

要立即使缓慢的单IP僵尸程序变得无用,只需使用abelenky建议的策略:将10分钟的缓存页面提供给最近24小时(或大约24小时)内发现的所有IP。这样,每个IP每天/每小时/每周都会获得一次“机会”(取决于您选择的时间段),并且对于仅点击“重新加载”的实际用户来说不会有明显的烦恼,除非他们不会赢报价。

这种措施的优点在于,只要它们不是源自僵尸网络,它也可以阻止“警报僵尸程序”。

(我知道,如果允许真实用户一遍又一遍地刷新,那么您可能会更喜欢它,但是如果没有CAPTCHA或类似的东西,就无法将垃圾邮件刷新请求者与垃圾邮件发送机器人区分开来)

第四招:reCAPTCHA:

没错,CAPTCHA会损害用户体验,应该避免使用。但是,在某种情况下,它们可以成为您最好的朋友:如果您设计了一个非常严格的系统来阻止机器人,则由于其局限性,它还会引起许多误报。那么,CAPTCHA 作为最后的手段,将使那些被抓住的真实用户因您的节流而滑倒(从而避免出现令人讨厌的DoS情况)。

最棒的是,当所有的僵尸程序都被捕获到您的网络中时,很少有真正的用户会受到CAPTCHA的打扰。

如果您在提供10分钟前的缓存页面时还提供了另一种可选的,经CAPTCHA验证的“首页刷新器”,那么真正想要保持刷新的人仍然可以这样做而无需获取旧的缓存页面,但要为每次刷新都必须解决一个验证码。这烦人,对于顽固的用户来说是可选的,他们倾向于宽容,因为他们知道他们正在玩系统来提高机会,而增加的机会并非免费。

第五招:诱饵废话:

克里斯托弗·马汉(Christopher Mahan)的想法我很喜欢,但是我会另辟spin径。每次准备新报价时,也要准备其他两个“要约”,这是任何人都不会采摘的,例如20毫米的12毫米小坚果。当要约出现在首页上时,请将所有三个“要约”放在同一张图片中,并带有与每个要约相对应的数字。当用户/机器人实际继续订购商品时,他们将不得不选择(单选按钮)想要的商品,并且由于大多数机器人只是在猜测,所以在三分之二的情况下,机器人将毫无价值地购买垃圾

自然,这不能解决“警报机器人”的问题,有人(很少)有机会建造能够选择正确物品的机器人。但是,意外购买垃圾的风险应使脚本编写者完全摆脱全自动机器人的攻击。

第六招:僵尸网络节流:

[已删除]

好吧............我现在大部分时间都在考虑这个问题,尝试使用不同的方法....全局延迟....基于cookie的令牌..排队服务... “陌生的节流”……而这根本行不通。没有。我意识到您尚未接受任何答案的主要原因是,没有人提出过阻止分布式/僵尸网络/僵尸网络攻击的方法...。所以我真的想破解它。我相信我在另一个线程中破解了僵尸网络身份验证问题,因此我也对您的问题寄予厚望。但是我的方法并不能转化为这一点。您只需要经过IP,并且足够大的僵尸网络不会在基于IP地址的任何分析中揭示自己。

这样就可以了:我的第六项措施没有了。没有。压缩。除非僵尸网络很小和/或足够快,以至于无法陷入通常的IP限制,否则我看不到针对不涉及诸如CAPTHA的明确人类验证的僵尸网络的任何有效措施。对不起,但是我认为结合以上五种措施是最好的选择。仅使用abelenky的10分钟缓存技巧,您可能就可以做到。


说得很好。感谢您的输入。
肖恩·米勒

3.并不是说,假设有一些机器人来自AOL的IP池,那么您正在为AOL的所有页面提供旧页面?
Andy Dent

@Andy:仅当所有 AOL用户共享与垃圾邮件发送程序相同的IP地址时。
詹斯·罗兰

6

如何引入需要人工干预的延迟,例如一种“ CAPTCHA游戏”。例如,这可能是一个小型Flash游戏,其中他们必须在30秒内爆破方格球并避免爆破实心球(避免色盲问题!)。将为游戏提供一个随机数种子,并且游戏传输回服务器的内容将是所单击点的坐标和时间戳以及所使用的种子。

在服务器上,您可以使用该种子来模拟游戏机制,以查看单击是否确实会使球破裂。如果他们这样做,不仅是人类,而且他们花了30秒钟来验证自己。给他们一个会话ID。

您可以让该会话ID进行所需的操作,但是如果发出过多的请求,它们将无法继续播放而不重新播放。


有趣的主意,但完全和完全破坏了用户体验。普通人访问该网站会认为它是30秒无用的等待。以任何方式接受30秒钟无聊的等待都是浏览互联网或使用Web应用程序的原因。
09年

普通人来访不会触发延迟,只有有人提出不合理的请求。这个想法在脸颊小舌头,但我可以看到它的工作,如果目标受众用于小flash游戏:)
保罗·迪克森

有趣的(几乎是万无一失的)想法,但我会感到恼火(尤其是在“金丝雀袋”热潮中),这将需要在服务器上进行大量处理以执行检查(这是问题的很大一部分)。此外,机器人程序可能会破灭泡沫。您必须经常更改规则。
Groxx,

假设每个游戏都发行了令牌,并且您知道发行令牌的时间,则只需尝试处理一次令牌,并且只需在发行后的30秒到300秒之间进行一次处理。它的优点在于,即使机器人确实破灭了泡沫,他们仍然需要等待30秒才能破灭泡沫。
Paul Dixon

另外,我们不要忘记这个想法是限制流量。页面上可能会说:“我们很忙,如果您急忙,玩这个游戏30秒钟,或者几分钟后再试一次……
Paul Dixon 2009年

5

已经发布了其他一些/更好的解决方案,但是出于完整性考虑,我想提到这一点:

如果您主要关注的是性能下降,并且您正在寻找真正的重,那么您实际上是在处理DoS攻击,您应该尝试相应地进行处理。一种常见的方法是在每秒/分钟/分钟等数量的连接后,简单地从防火墙中的IP丢弃数据包。例如,标准Linux防火墙iptables具有标准操作匹配功能“ hashlimit”,可用于将每个时间单位的连接请求与IP地址相关联。

虽然,这个问题可能更适合上次SO播客中提到的下一个SO衍生产品,但它尚未发布,所以我认为可以回答了:)

编辑:
正如novatrust所指出的那样,实际上仍然有ISP并未向其客户分配IP,因此,有效地,此类ISP的脚本客户会禁用该ISP的所有客户。


不幸的是,某些ISP共享了退出IP地址。例如,AOL成员所在的IP地址数量有限: webmaster.info.aol.com/proxyinfo.html 您的解决方案将对许多ISP的用户数量施加硬限制。
罗伯特·韦纳布尔斯2009年

哇,我很震惊。这样的东西还在继续吗?
falstro

天啊。我猜那时AOL不会访问我的网站。
卡尔

5

在应用程序前面的apache服务器上编写一个反向代理,该服务器实现了Tarpit (维基百科文章)来惩罚机器人。它只会管理最近几秒钟内连接的IP地址列表。您检测到来自单个IP地址的大量请求,然后以指数方式延迟这些请求,然后再进行响应。

当然,如果多个人处于NAT的网络连接中,他们可能来自同一个IP地址,但是一个人不太可能会介意您的响应时间为2mS至4mS(甚至400mS),而机器人会受到阻碍被增加的延迟很快。


4
  1. 提供RSS提要,以免他们占用您的带宽。
  2. 购买时,让每个人随机等待 最多45秒或类似的时间,具体取决于您要寻找的东西。究竟您的时间限制是什么?
  3. 给每个人1分钟的时间在绘图中输入他们的名字,然后随机选择人物。我认为这是最公平的方式。
  4. 监视帐户(在会话中包含一些时间并存储吗?),并向似乎低于人员速度阈值的帐户添加延迟。这至少将使机器人被编程为放慢速度并与人类竞争。

这些是有趣的概念,但是“随机选择”和等待时间消除了我猜woot依赖的许多“疯狂”。消除时间紧迫性已经毁了这个网站。
TM。

如果看起来像图纸,那么他必须处理赌博法。不值得。
jmucchiello,2009年

4

首先,根据定义,不可能支持无状态(即真正的匿名)交易,同时还能够将漫游器与合法用户分开。

如果我们可以接受这样一个前提,那就是我们可以在他的首页点击中对一个崭新的吸引人的访客施加一些费用,我认为我有一个可能的解决方案。由于缺乏更好的名称,我将这个解决方案简称为“访问DMV”。

假设有一家汽车经销店每天提供不同的新车,在某些日子里,您可以每辆5美元(限额3)的价格购买奇特的跑车,再加5美元的目的地费用。

要注意的是,经销店要求您访问经销店并出示有效的驾驶执照,然后才允许您进入房门查看正在销售的汽车。此外,您必须具有有效的驾驶执照才能进行购买。

因此,第一次来此汽车经销商的访客(我们称他为鲍勃)被拒绝入境,并被转介到DMV办公室(就在附近),以获取驾驶执照。

在显示其驾驶执照后,允许其他具有有效驾驶执照的访客进入。一个会整日闲逛,缠着推销员,拿起小册子,倒空免费的咖啡和饼干来惹人讨厌的人最终将被拒之门外。

现在,回到没有许可证的鲍勃-他要做的就是忍受一次DMV的访问。之后,除非他不小心将钱包留在家里,否则他可以随时随地访问经销商并购买汽车,除非他的驾照被毁或被吊销。

这个世界上的驾照几乎是不可能伪造的。

访问DMV涉及首先在“从这里开始”队列中获得申请表。鲍勃必须将完成的申请带到#1窗口,在那里许多好心的公务员中的第一个人将拿走他的申请,进行处理,如果一切正常,请为该窗口盖章,然后将其发送到下一个窗口。因此,鲍勃从一个窗口走到另一个窗口,等待应用程序的每一步都经过,直到他终于走到最后并获得了驾驶执照。

试图“短路” DMV没有任何意义。如果没有一式三份正确填写表格,或者在任何窗口中都未给出正确答案,则应用程序将被撕毁,不幸的客户将被送回原处。

有趣的是,无论办公室有多满或多空,在每个连续的窗口中进行维修所需的时间都差不多。即使您是唯一的排队人员,似乎该人员还是喜欢让您在黄线后面等待一分钟,然后说出“下一步!”。

但是,DMV并没有那么糟糕。在等待所有等待许可的过程中,当您在DMV大厅时,您可以观看有关汽车经销商的非常有趣且内容丰富的信息电视。实际上,该信息技术产品的运行时间足够长,足以覆盖您花费在获得许可证上的时间。

稍微技术性的解释:

正如我在最高层所说的那样,有必要在客户端与服务器之间建立某种状态,以使您能够将人与机器人区分开来。您想要以一种不会过度惩罚匿名(未经身份验证)人类访客的方式来做到这一点。

这种方法可能需要AJAX-y客户端处理。吸引了全新的访问者来获得“欢迎新用户!” 包含文本和图形的页面,该页面(通过适当的服务器端限制)需要几秒钟才能完全加载。在这种情况发生时(访问者可能正忙着阅读欢迎页面),他的识别令牌正在缓慢地组装。

假设,为了讨论起见,令牌(也称为“驾驶执照”)由20个块组成。为了获取每个连续的块,客户端代码必须向服务器提交有效请求。服务器包含故意的延迟(例如200毫秒),然后再发送下一个块以及发出下一个块请求所需的“戳记”(即,从一个DMV窗口转到下一个DMV窗口所需的戳记)。总的来说,大约需要4秒钟才能完成块挑战响应块挑战响应...块挑战响应完成过程。

在此过程结束时,访问者拥有一个令牌,该令牌使他可以转到产品描述页面,然后转到购买页面。令牌是每个访客的唯一ID,可用于限制其活动。

在服务器端,您仅接受来自具有有效令牌的客户端的页面视图。或者,如果让每个人最终都能看到该页面很重要,请对缺少有效令牌的请求进行时间限制。

现在,为了使它相对于合法的访客而言是良性的,这使得令牌发行过程在后台相对非侵入地进行。因此,对带有有趣的副本和图形的欢迎页面的需求被故意降低了。

这种方法会迫使机器人停止使用现有令牌,或花费最少的设置时间来获取新令牌。当然,这对于使用虚假访问者的分布式网络进行的复杂攻击没有太大帮助。


4

即使使用了验证码,也无法完全阻止机器人。但是,编写和维护机器人程序可能会很麻烦,因此数量有所减少。特别是通过强迫他们每天更新他们的机器人,将使大多数人失去兴趣。

以下是一些使编写机器人更加困难的想法:

  • 需要运行javascript函数。Javascript使编写机器人更加痛苦。如果他们没有运行javascript,则可能需要验证码才能仍然允许实际的非javascript用户(最少)。

  • 在输入表单时再次输入击键时间(再次通过javascript)。如果不是人类,那就拒绝它。模仿人类在bot中打字是很痛苦的。

  • 编写代码以使用新的随机值每天更新字段ID。这将迫使他们每天更新自己的机器人,这很痛苦。

  • 编写代码以每天对字段进行重新排序(显然,这对用户不是随机的)。如果他们依赖现场订单,这将使他们绊倒,并再次迫使他们对其机器人代码进行日常维护。

  • 您甚至可以进一步使用Flash内容。编写机器人来对抗Flash完全是一种痛苦。

通常,如果您开始采取不阻止它们的思路,而是让它们对他们更有帮助,则可能可以实现您想要的目标。


但是,人类有时会进行非人类的打字-形式填充。
罗伦·佩希特尔

您需要考虑到非常不同的键入样式/速度-从hunt'n'peck到touchtyping的所有内容。编写介于两者之间的机器人并不难。诸如可变字段ID和顺序之类的内容可以通过阅读和解析表单来规避,这并不是很难。
Kornel

4

对于未注册用户,在所有产品公告上延迟5分钟。临时用户不会真正注意到这一点,而非临时用户无论如何都将被注册。


3

我没有看到您要求检查传入IP带来的沉重负担。相反,我为一个客户完成了一个项目,该项目每五分钟分析一次HTTP访问日志(它可能是实时的,但出于某些我从未完全理解的原因,他不希望这样做),创建防火墙规则,以阻止与产生过多请求的任何IP地址的连接,除非可以确认该地址属于合法搜索引擎(例如Google,yahoo等)。

该客户端运行Web托管服务,并在三台服务器上运行此应用程序,它们总共处理800-900个域。高峰活动处于每秒数千次点击的范围内,并且从未存在性能问题-防火墙非常有效地从黑名单地址中丢弃数据包。

而且,是的,DDOS技术确实确实存在,它将击败该方案,但是他没有看到在现实世界中发生这种情况。相反,他说这大大减少了服务器上的负载。


3

我的方法是将重点放在非技术解决方案上(否则,您将输掉军备竞赛,或者至少花费大量时间和金钱)。我主要关注帐单/发货部分-您可以通过查找到同一地址的多次送货或通过一种付款方式多次收取费用来找到机器人。您甚至可以在几周内对所有商品执行此操作,因此,如果用户获得了先前的商品(通过非常快速的响应),这次可能会为他分配某种“障碍”。

这也会产生副作用(我想这是有益的,但对于您的情况,我可能在营销方面是错误的),可能会扩大幸运者和购买欲望者的圈子。


3

大多数纯技术解决方案已经提供。因此,我将对问题提出另一种看法。

据我了解,机器人是由真正试图购买您要出售的包的人建立的。问题是 -

  1. 其他不使用机器人的人也有机会购买,而您提供的行李数量有限。
  2. 您想吸引人们到您的站点,而只卖袋子。

您可以使潜在的买手可以订阅电子邮件,甚至可以更新SMS,从而可以在发生销售时收到通知,而不必试图避免漫游器。您甚至可以给他们一分钟或两个开始的时间(出售开始,随机生成并随邮件/ SMS发送的特殊URL)。

当这些买家去购买时,他们就在您的网站上,您可以在侧边横幅上显示所需的内容。那些运行漫游器的人将更喜欢简单地注册到您的通知服务。

机器人运行者可能仍会根据您的通知运行机器人,以更快地完成购买。某些解决方案可以提供一键式购买。

顺便说一句,您提到您的用户尚未注册,但是听起来那些购买这些手袋的人并不是随机的购买者,而是期待这些销售的人。这样,他们可能愿意注册以获得尝试“赢”包的优势。

本质上,我建议的是尝试将问题视为一种社会问题,而不是技术问题。

阿萨夫


2

限时的用户代理,每分钟发出很多请求。例如,如果有人每隔5秒正好每5秒请求一次页面,那么他们可能不是用户...但是正确地做到这一点可能很棘手。

如果他们触发了警报,请使用尽可能少的DB-IO将每个请求重定向到静态页面,并显示一条消息,告知他们将在X分钟之内重新启用它们。

重要的是要补充一点,您可能只应将此请求应用于页面请求,而忽略所有对媒体的请求(js,图像等)。


我已经在一个个人项目上做到了,这似乎是个好方法。您只需要记住所有ip击中您的页面时的IP,并设置规则来确定过于频繁地访问页面的含义。问题是OP表示检查IP太昂贵了,我不明白。
卡尔

如果您自己进行IP检查(即在数据库中,从PHP脚本或其他工具中),那么它将非常昂贵。获取防火墙为您做,它变得更加可行。
rmeador

rmeador:似乎也很难确定请求是针对HTML还是其他媒体。如果您的页面上有20个外部内容,则您需要在1-2秒内查看至少21个对新用户的请求。
Oli

2

阻止DoS可能会破坏他在上文概述的@davebug目标中的#2,“以不受机器人阻止的速度保持站点”,但不必解决#1,“将项目卖给非脚本编写的人”

我确信脚本编写者可以在超出极限的范围内写一些东西来滑冰,这仍然比人类通过订购表格要快。


2

好的,这样垃圾邮件发送者就可以与普通人竞争,赢得“废话”拍卖吗?为什么不让下一次拍卖成为字面上的“废话”?垃圾邮件发送者可以为装满狗狗的袋子支付高昂的钱,我们都嘲笑他们。


2

这里重要的是要更改系统以减轻服务器负载,防止机器人赢得垃圾袋,而不必让机器人知道您正在使用它们,否则他们将修改其策略。我认为没有任何处理方法就没有结束时。

因此,您可以在首页上记录点击。每当有人点击该页面时,就会将该连接与其上一次点击进行比较,如果连接速度太快,则会向该页面发送不提供报价的版本。这可以通过某种负载平衡机制来完成,该机制将bot(过快的匹配)发送到仅提供主页缓存版本的服务器。真正的人被发送到好的服务器。这减轻了主服务器的负担,并使僵尸程序认为它们仍在正确地向页面提供服务。

如果可以通过某种方式拒绝报价,那就更好了。然后,您仍然可以在人造服务器上进行报价,但是当bot填写表格时说“对不起,您的速度不够快” :)然后,他们肯定会认为它们仍在游戏中。


2

您怎么知道有脚本编写者下订单?

问题的症结在于,您无法将脚本编写者与合法用户分开,因此无法阻止它们,那么您怎么知道根本没有脚本编写者呢?

如果您有办法回答这个问题,那么您可以使用一组特征来过滤脚本。


2

让我们从头开始思考这个问题-您让机器人购买了您想要真实的人购买的东西,如何真正地使机器人购买您希望真实的人购买的东西。

抓取机器人会认为某些非显示html的随机情况是真实情况,但真实的人不会看到(并且不要忘记真实的人包括盲人,因此也请考虑使用屏幕阅读器等),并且这会导致您购买非常昂贵的东西(或者没有进行实际购买,而是获得了付款细节供您列入黑名单)。

即使漫游器切换为“提醒用户”而不是“进行购买”,如果您可以获得足够的错误警报,也可能使它对人们来说毫无价值(也许不是每个人,但一定程度上减少了欺诈总比没有好)不打扰。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.