Dav*_*dge 489 scripting bots detection e-commerce
我已经接受了答案,但遗憾的是,我相信我们仍然坚持我们最初的最坏情况:CAPTCHA每个人都在购买废话的尝试.简短说明:缓存/ Web场无法跟踪命中,任何解决方法(发送非缓存的Web信标,写入统一表等)都会使网站的速度比机器人更慢.思科等可能有一些昂贵的硬件可以提供高水平的帮助,但如果每个人都可以选择CAPTCHA,那么很难证明成本是合理的.我稍后会尝试更全面的解释,以及为未来的搜索者清理它(尽管欢迎其他人尝试,因为它是社区维基).
这是关于woot.com上的包装销售情况.我是Woot Workshop的总裁,Woot是Woot的子公司,负责设计,撰写产品说明,播客,博客文章以及审核论坛.我使用CSS/HTML,我只是熟悉其他技术.我与开发人员密切合作,并在这里讨论了所有答案(以及我们已经拥有的许多其他想法).
可用性是我工作的重要组成部分,使网站令人兴奋和有趣是其余部分.这就是下面三个目标的来源.CAPTCHA损害了可用性,机器人从我们的垃圾销售中窃取了乐趣和兴奋.
对于随机垃圾销售,机器人在第二次屏幕抓取(和/或扫描我们的RSS)时数十次关闭我们的头版.他们看到的那一刻,它触发了登录程序的第二阶段,点击我想要一个,填写表格,并购买废话.
lc:在stackoverflow和其他使用此方法的站点上,它们几乎总是处理经过身份验证的(已登录)用户,因为正在尝试的任务需要这样做.
在Woot上,匿名(未登录)用户可以查看我们的主页.换句话说,砰击机器人可以是非认证的(并且除了IP地址之外基本上是不可跟踪的).
所以我们又回到了扫描IP,其中a)在这个云网络和spambot僵尸时代相当无用,以及b)因为来自一个IP地址的企业数量而吸引了太多的无辜者(更不用说与非静态IP ISP和潜在的性能命中试图跟踪这个).
哦,让人们打电话给我们将是最糟糕的情况.我们可以让他们打电话给你吗?
BradC:Ned Batchelder的方法看起来很酷,但它们的设计非常坚固,可以击败为网站构建的机器人.我们的问题是机器人是专门为打败我们的网站而构建的.其中一些方法可能会在很短的时间内工作,直到脚本编写者发展他们的机器人忽略蜜罐,屏幕刮擦附近的标签名称而不是表单ID,并使用支持javascript的浏览器控件.
lc:"当然,除非炒作是你营销计划的一部分." 是的,肯定是.当项目出现时的惊喜,以及如果你设法获得一个项目的兴奋可能与你最终得到的垃圾一样重要或更重要.任何消除先到先得的东西都不利于"赢得"垃圾的快感.
novatrust:我是一个人,欢迎我们新的机器人霸主.我们实际上提供RSSfeeds以允许第三方应用程序扫描我们的网站以获取产品信息,但不会超出主站点HTML.如果我正确地解释它,你的解决方案确实通过完全牺牲目标1来帮助目标2(性能问题),并且只是辞去机器人将购买大部分垃圾的事实.我对你的回复进行了投票,因为你的最后一段悲观情绪对我来说是准确的.这里似乎没有银弹.
其余的响应通常依赖于IP跟踪,再次,这似乎无用(使用僵尸网络/僵尸/云网络)和有害(捕获来自同一IP目的地的许多无辜者).
还有其他方法/想法吗?我的开发人员一直在说"我们只是做CAPTCHA",但我希望所有真正想要我们废话的人都会采用较少侵入性的方法.
假设您正在销售具有很高感知价值的便宜货,并且您的数量非常有限.没有人确切知道你何时会出售这件物品.超过一百万人经常来看看你卖的是什么.
你最终会得到脚本编写者和机器人试图以编程方式[a]弄清楚你卖的东西,并且[b]确保他们是第一个购买它的人.这很糟糕有两个原因:
一个看似显而易见的解决方案是为您的用户创建一些环节,以便在下订单之前跳过,但至少有三个问题:
另一种解决方案是监视IP经常发生的攻击,阻止它们进入防火墙,或以其他方式阻止它们进行排序.这可以解决2.并且防止[b],但是扫描IP的性能是巨大的,并且可能会导致比脚本编写者自己造成的更多问题.此外,云网络和spambot僵尸的可能性使IP检查相当无用.
第三个想法,迫使订单表格被加载了一段时间(比如说,半秒钟)可能会减慢快速订单的进度,但同样,脚本编写者仍然会成为第一批人,无论如何都不会对实际用户.
lc.*_*lc. 229
如何实现像SO一样的CAPTCHA?
如果您正常使用该网站,您可能永远不会看到一个.如果您碰巧经常重新加载同一页面,过快地发布连续评论,或者触发警报的其他内容,请让他们证明他们是人.在您的情况下,这可能是对同一页面的不断重新加载,快速跟踪页面上的每个链接,或者填写订单形式太快而不能成为人类.
如果它们连续x次失败(例如,2或3),则给该IP超时或其他此类措施.然后在超时结束时,再将它们转储回检查.
由于您有未注册的用户访问该站点,因此您只能使用IP.您可以向每个浏览器发出会话,并根据需要跟踪.当然,如果连续创建(重新)创建太多会话(如果机器人不断删除cookie),则抛出人工检查.
至于捕获太多无辜者,你可以在人工检查页面上提出免责声明:"如果有太多匿名用户从同一地点查看我们的网站,也会出现此页面.我们建议您注册或登录以避免这个." (适当调整措辞.)
此外,X人从一个IP同时加载同一页面的几率是多少?如果它们很高,也许你需要一个不同的机器人警报触发机制.
编辑:另一个选择是,如果他们失败了太多次,你对产品的需求充满信心,阻止他们并让他们亲自打电话给你删除阻止.
让人们打电话似乎确实是一种愚蠢的措施,但它确保人类在计算机后面的某个地方.关键是只允许块用于一个几乎不会发生的条件,除非它是一个机器人(例如连续多次检查失败).然后它FORCES人类互动 - 拿起电话.
在回应他们给我打电话的评论时,显然这里有权衡.您是否担心确保您的用户在上市时接听几个电话?如果我非常担心产品会吸引人类用户,我就必须做出这个决定,也许会牺牲我的一小部分时间.
由于您似乎决定不让机器人占据优势,所以我相信手机可能是一个不错的选择.由于我没有从您的产品中获利,我没有兴趣接收这些电话.如果你分享一些利润,我可能会对此感兴趣.由于这是您的产品,您必须决定您的关注程度并相应地实施.
释放块的其他方式不是那么有效:超时(但是他们会在冲洗后重新淹没你的网站),长时间超时(如果真的是人类试图购买你的产品,他们是SOL并因未通过检查而受到惩罚),电子邮件(很容易通过机器人完成),传真(相同)或蜗牛邮件(花费太长时间).
当然,您可以在每次超时时使每个IP的超时时间增加.只要确保你不会无意中惩罚真正的人类.
Chr*_*han 190
你需要想办法让机器人购买价格过高的东西:12毫米的翅膀:20美元.看看在脚本编写者决定你正在游戏之前抢占了多少机器人.
利用这些利润购买更多服务器并支付带宽.
abe*_*nky 161
我的解决方案是通过为"机器人和脚本"提供大约10分钟的延迟来使屏幕抓取毫无价值.
这是我如何做到的:
您不需要在每次点击时记录每个IP地址.每20次点击左右只跟踪一次.重复犯罪者仍会出现在随机的偶然跟踪中.
在大约10分钟前保留页面缓存.
当一个重复的击球手/机器人击中你的网站时,给他们10分钟的旧缓存页面.
他们不会马上知道他们会得到一个旧网站.他们将能够抓住它,以及一切,但他们不会再赢得任何比赛,因为"真正的人"将有10分钟的领先优势.
优点:
缺点
你怎么看?
Bra*_*adC 54
在这里看看这篇由Ned Batchelder撰写的文章.他的文章是关于停止垃圾邮件,但相同的技术可以很容易地适用于您的网站.
我们可以通过让机器人难以成功发布,或让他们无意中将自己标识为机器人,而不是通过让人们识别自己来阻止机器人.这消除了人们的负担,并使评论表格不受可见的反垃圾邮件措施的影响.
这种技术是我如何防止这个网站上的垃圾邮件.有用.这里描述的方法根本不看内容.
其他一些想法:
编辑:要完全清楚,Ned上面的文章描述了通过阻止BOT通过表单提交订单来防止自动购买项目的方法.他的技术对于防止机器人屏幕抓取主页以确定何时出售Bandorer of Carrots是没有用的.我不确定防止那是真的可能.
关于你对Ned策略有效性的评论:是的,他讨论了蜜罐,但我不认为这是他最强的策略.他对SPINNER的讨论是我提到他的文章的原因.对不起,我在原帖中没有说清楚:
微调器是一个隐藏的字段,用于一些事情:它汇集了许多防止篡改和重放的值,并用于模糊字段名称.微调器是MD5哈希:
- 时间戳,
- 客户端的IP地址,
- 被评论的博客条目的条目ID,和
- 一个秘密.
以下是您在WOOT.com上实现的方法:
每次新项目开始销售时,更改用作哈希部分的"秘密"值.这意味着如果有人要设计BOT来自动购买物品,它只会在下一个物品上市之前有效!
即使有人能够快速重建他们的机器人,所有其他实际用户也已经购买了BOC,您的问题就解决了!
他讨论的另一个策略是不时更改蜜罐技术(再次,当新产品上市时更改它):
我想我的总体想法是在每件新商品上市时更换表格设计.或者至少在新BOC上市时更改它.
这是什么,几次/月?
如果你接受这个答案,你会在下一个到期时给我一个预告吗?:)
Ste*_*owe 44
问:你如何阻止脚本编写者每秒数百次抨击你的网站?
答:你没有.外部代理无法阻止此行为.
您可以使用大量技术来分析传入的请求,然后尝试确定谁是和不是人......但它会失败.最终,如果没有立即.
唯一可行的长期解决方案是改变游戏,使网站不是机器人友好的,或者对脚本编写者不那么有吸引力.
你是怎样做的?嗯,这是一个不同的问题!;-)
...
好的,上面已经给出(并拒绝)了一些选项.我对你的网站并不十分熟悉,只看过一次,但由于人们可以阅读图片中的文字而机器人不能轻易做到这一点,所以将公告更改为图像.不是CAPTCHA,只是一张图片 -
对真实的人做出响应的时间试验,忽略('哎呀,发生错误,抱歉!请再试一次')响应的速度比(比如说)这段时间的一半要快.此事件还应触发开发人员警告至少一个机器人已经找到代码/游戏,因此是时候更改代码/游戏了.
无论如何,即使没有机器人触发它,也要继续定期更改游戏,只是为了浪费脚本编写者的时间.最终脚本编写者应该厌倦游戏并去其他地方...我们希望;-)
最后一个建议是:当您的主页请求进入时,将其放入队列并在单独的进程中按顺序响应请求(您可能必须破解/扩展Web服务器才能执行此操作,但它可能会值得).如果第一个请求在队列中时来自同一IP /代理的另一个请求进入,则忽略它.这应该会自动减轻机器人的负担.
编辑:除了使用图像之外,另一个选择是使用javascript填写买/不买文; 机器人很少解释javascript,所以他们不会看到它
Zac*_*son 30
我不知道这有多可行:......继续进攻.
找出机器人扫描的数据.当你不卖垃圾时,给他们提供他们正在寻找的数据.以不会打扰或混淆人类用户的方式执行此操作.当机器人触发第二阶段时,他们将登录并填写表格以购买100美元的roombas而不是BOC.当然,这假设机器人不是特别健壮.
另一个想法是在袋子销售期间实施随机价格下降.当你明确指出它只值20美元时,谁会以150美元的价格购买随机包装?没有人,但过于热心的机器人.但是9分钟后它就是35美元......然后17分钟后它就是9美元.管他呢.
当然,僵尸国王能够做出反应.重点是让他们的错误对他们来说变得非常昂贵(并让他们付钱给你打他们).
所有这一切都假设你想要惹恼一些机器人领主,这可能不是100%可取的.
Ovi*_*vid 22
所以问题实际上似乎是:机器人想要他们的"袋子"垃圾,因为它具有低感知价格的高感知价值.你有时提供这个项目和机器人潜伏,等待它是否可用,然后他们购买该项目.
由于看起来机器人所有者正在赚取利润(或潜在地赚取利润),所以诀窍是通过鼓励他们购买废话来使这对他们无利可图.
首先,总是提供"袋子'废话".
其次,确保垃圾通常是垃圾.
第三,经常旋转垃圾.
简单,不是吗?
你需要一个永久的"为什么我们的垃圾有时会废话?" 提供旁边的链接,向人们解释正在发生的事情.
当机器人看到有废话并且废话被自动购买时,收件人会非常不安,因为他们已经为破牙签支付了10美元.然后是一个空的垃圾袋.然后是鞋底的一些污垢.
如果他们在相对较短的时间内购买了足够的垃圾(并且你在整个地方都有大量免责声明解释你为什么要这样做),那么他们将会失去一个公平的"袋子"现金" bag'o crap".如果你经常旋转垃圾,即使是人为干预(检查以确保垃圾不是垃圾)也会失败.哎呀,也许机器人会注意到并且不会购买旋转时间太短的任何东西,但这意味着人类将购买非垃圾.
哎呀,你的老顾客可能会觉得很有趣,你可以把它变成一个巨大的营销胜利.开始发布有多少"垃圾"鲤鱼被出售.人们会回来看看机器人被咬的有多难.
更新: 我希望你可能会在人们抱怨的情况下预先打几个电话.我认为你不能完全阻止它.但是,如果这会杀死机器人,您可以随时停止它并稍后重新启动它.
Chr*_*rch 15
将该项目出售给非脚本人类.
保持网站以不受机器人减速的速度运行.
不要为完成任何任务而对"正常"用户进行麻烦,以证明他们是人.
你可能不想听到这个,但#1和#3是相互排斥的.

好吧,没有人知道你也是一个机器人.没有程序方法可以告诉连接的另一端是否有人,而不需要该人做某事.阻止脚本/机器人在网上做事是CAPTCHAs发明的全部原因.这并不是说这是一个没有花费大量精力的新问题.如果有一个更好的方法,一个不涉及CAPTCHA真正用户的麻烦,每个人都会使用它.
我认为你需要面对这样一个事实:如果你想让机器人关闭你的订购页面,一个好的CAPTCHA是唯一的方法.如果对你的随机垃圾的需求足够高以至于人们愿意花这些时间来获得它,那么合法用户就不会被CAPTCHA推迟.
Ada*_*vis 13
Woot用于解决这个问题的方法正在改变游戏 - 字面意思.当他们呈现一个非常理想的待售物品时,他们会让用户玩视频游戏以便订购.
这不仅可以成功打击机器人(它们可以轻松地对游戏进行微小的改动以避免自动玩家,甚至为每次销售提供新游戏),但它也给用户留下了"赢得"所需物品同时放慢速度的印象订购流程.
它仍然很快售罄,但我认为解决方案很好 - 重新评估问题并改变参数导致了一个成功的策略,严格的技术解决方案根本不存在.
您的整个商业模式基于"先到先得".你不能做广播电台做的事情(他们不再让第一个来电者成为赢家,他们让第5或第20或第13个来电者成为赢家) - 它与你的主要功能不符.
不,如果不改变真实用户的订购体验,就无法做到这一点.
假设您实施了所有这些策略.如果我认为这很重要,我只需要100个人与我一起工作,我们将构建软件以在我们的100台独立计算机上工作,并且每秒访问您的站点20次(每个用户访问间隔5秒) cookie /帐户/ IP地址).
你有两个阶段:
你不能把验证码阻塞#1 - 这将失去真正的客户("什么?每次我想看到最新的woot时我必须解决验证码?!?").
因此,我的小组观看,一起计时,所以我们每秒大约进行20次检查,看到更改的人首先警告所有其他人(自动),谁将再次加载首页,按照订单链接,并执行交易(这可能也会自动发生,除非你实现验证码并为每个wootoff/boc更改它.
你可以在2号前面放一个验证码,虽然你不愿意这样做,但这可能是确保即使机器人看到头版,真正的用户正在获取产品的唯一方法.
但即使使用验证码,我的100个小乐队仍然具有显着的先发优势 - 而且你无法分辨我们不是人类.如果你开始计时我们的访问,我们只是添加一些抖动.我们可以随机选择要刷新的计算机,以便访问顺序不断变化 - 但仍然看起来像人类一样.
你需要有一个自适应防火墙来监视请求,如果有人做了明显愚蠢的事情 - 在同一个IP上每秒刷新一次以上,然后采用策略来降低它们的速度(丢弃数据包,发送回拒绝或500错误等) ).
这应该会显着降低您的流量并改变机器人用户使用的策略.
你真的不想听到这个......但......
我认为您需要的是自下而上的完全自定义解决方案.
您不需要乱用TCP/IP堆栈,但您可能需要开发一个非常非常非常快速的自定义服务器,该服务器旨在关联用户连接并对各种攻击作出适当的反应.
Apache,lighthttpd等都非常适合灵活,但是你运行一个单一用途的网站,你真的需要能够做到比现有服务器都做的更多(在处理流量和适当打击机器人方面) ).
通过在自定义服务器上提供大部分静态网页(每30秒左右更新一次),您不仅应该能够处理10倍的请求和流量(因为服务器除了获取请求之外没有做任何事情,并且正在阅读从内存到TCP/IP缓冲区的页面)但它也可以让您访问可能有助于减慢僵尸程序的指标.例如,通过关联IP地址,您可以简单地阻止每个IP每秒多个连接.人类不能比这更快,甚至使用相同NATed IP地址的人也很少被阻止.你想要做一个缓慢的阻止 - 在正式终止会话之前保持连接一整秒.这可以加入防火墙,为特别严重的违法者提供长期阻止.
但实际情况是,无论你做什么,当机器人由人为一个目的定制时,没有办法告诉人类除了机器人.僵尸程序仅仅是人类的代理.
在一天结束时,你不能告诉人和计算机分开观看头版.您可以在订购步骤停止机器人,但机器人用户仍具有先发优势,您仍然需要管理巨大的负载.
您可以为简单的机器人添加块,这将提高标准,减少人们的麻烦.这可能就足够了.
但是如果不改变你的基本型号,那你就不走运了.你可以做的最好的事情就是照顾简单的情况,使普通用户不会注意到服务器这么快,并且销售这么多项目,即使你有几百万个机器人,因为许多普通用户希望他们能得到它们.
您可以考虑设置蜜罐并将用户帐户标记为僵尸用户,但这会产生巨大的负面社区反弹.
每当我想到一个"好吧,做这个怎么样......"我总能用一个合适的僵尸策略来对抗它.
即使你让首页成为验证码进入订购页面("这个商品的订购按钮是蓝色的粉红色闪光,在这个页面的某个地方"),机器人只需打开页面上的所有链接,并使用任何一个来回到订购页面.这是没有办法赢得这个.
让服务器变得快速,在订购页面上放入一个reCaptcha(我发现的唯一一个不容易被愚弄的,但对你的应用来说可能太慢了),并考虑稍微改变模型的方法普通用户有机会用户的机会.
-亚当
lc.*_*lc. 11
免责声明:这个答案完全与非编程相关.但是,它确实试图首先攻击脚本的原因.
另一个想法是,如果你真的有限量出售,为什么不从先到先得的方法改变它?当然,除非炒作是您营销计划的一部分.
还有很多其他选择,我相信其他人可以想到一些不同的选择:
排序队列(预订系统) - 某些脚本可能仍然在队列的前面,但是手动输入信息可能更快.
抽奖系统(每个试图订购一个的人都会进入系统) - 这样,拥有脚本的人与没有脚本的人有相同的机会.
优先排队 - 如果确实有很高的感知价值,人们可能愿意支付更多.实现一个排序队列,但允许人们支付更多费用以置于队列中更高的位置.
拍卖(大卫施密特为此拍卖,评论是我自己的) - 人们仍然可以在最后一分钟使用脚本进行狙击,但不仅会改变定价结构,人们也期望与其他人一起抗争.您还可以做一些事情来限制给定时间段内的出价数量,让人们提前拨打授权码等等.
Pet*_*ris 11
无论纳粹认为他们的通信有多么安全,盟友往往会打破他们的信息.无论你如何阻止机器人使用你的网站,机器人所有者都会找到解决方法.对不起,如果这让你成为纳粹分子:-)
我认为需要一种不同的心态
深入思考,无论您的网站的客户是人还是机器人都无关紧要,两者都只是付费客户; 但是一个人比另一个人有不公平的优势.一些没有太多社交生活(隐士)的用户可能会像您的网站其他用户一样烦恼.
记录您发布优惠的时间以及帐户选择购买优惠的时间.
这可以让您记录客户购买东西的速度.
改变您发布优惠的时间.
例如,有一个3小时的窗口从一天的某个模糊时间开始(午夜?)只有机器人和隐士会不断刷新页面3小时,只是为了在几秒钟内获得订单.永远不要改变基准时间,只改变窗户的大小.
随着时间的推移,将出现一幅画面.
01:您可以看到哪些帐户在他们上线后的几秒钟内定期购买产品.建议他们可能是机器人.
02:您还可以查看优惠所用的时间窗口,如果窗口是1小时,那么一些早期买家将是人类.但是人类很少会刷新4小时.如果发布/购买之间的经过时间非常一致,无论窗口持续时间如何,那么这就是机器人.如果小窗口的发布/购买时间很短,而大窗户的发布/购买时间会更长,那就是隐士!
现在,您没有停止机器人使用您的网站,而是有足够的信息告诉您机器人当然使用了哪些帐户,以及隐士可能会使用哪些帐户.您对这些信息的处理取决于您,但您当然可以使用它来使您的网站更贴近有生命的人.
我认为禁止机器人帐户将毫无意义,这类似于打电话希特勒并说"感谢你的U艇的位置!" 不知何故,您需要以帐户所有者不会意识到的方式使用这些信息.让我们看看我是否可以梦想......
处理队列中的订单:
当客户下订单时,他们会立即收到一封确认电子邮件,告知他们将订单放入队列中,并在处理完毕后收到通知.我在亚马逊上通过订单/发送来体验这种事情,它根本不会打扰我,我不介意几天后收到一封电子邮件告诉我我的订单已经发送,只要我立即收到一封电子邮件告诉我亚马逊知道我想要这本书.在你的情况下,它将是一封电子邮件
用户认为他们在公平的队列中.每隔1小时处理一次队列,以便普通用户也会遇到队列,以免引起怀疑.只有从机器人和隐士帐户处理订单,一旦他们已经在队列中"人类平均订购时间+ X小时".有效减少机器人的机器人.
Rob*_*les 10
我说使用API公开价格信息.这是不直观的解决方案,但它可以帮助您控制情况.为API添加一些限制,使其功能略逊于网站.
你也可以这样做订购.您可以尝试对API功能/性能进行小的更改,直到获得所需的效果.
有代理和僵尸网络可以打败IP检查.有一些非常好的验证码阅读脚本.印度甚至有一些工人团队以很低的价格击败验证码.您可以提出的任何解决方案都可以合理地失败.甚至Ned Batchelder的解决方案也可以通过使用WebBrowser控件或其他模拟浏览器以及僵尸网络或代理列表来解决.
小智 8
我们目前正在使用F5的最新一代BigIP负载平衡器来实现这一目标.BigIP具有先进的流量管理功能,可以根据频率和使用模式识别刮板和机器人,即使是在单个IP背后的一组源中也是如此.然后它可以限制这些内容,为它们提供替代内容,或者只是使用标题或cookie标记它们,以便您可以在应用程序代码中识别它们.
首先,让我回顾一下我们在这里需要做的事情.我意识到我只是在解释原来的问题,但重要的是我们要100%顺利,因为有很多很好的建议可以让4个中的2个或3个正确,但正如我将证明的那样,你需要一个多方面的方法来满足所有要求.
要求1:摆脱'bot slamming':
首页的快速"猛烈关注"会损害您网站的性能,并且是问题的核心."砰击"来自单核机器人和 - 据说 - 来自僵尸网络.我们想摆脱两者.
要求2:不要乱用用户体验:
我们可以通过实施令人讨厌的验证程序来非常有效地修复机器人情况,例如打电话给人类操作员,解决一堆CAPTCHA或类似问题,但这就像迫使每个无辜的飞机乘客跳过疯狂的安全箍而只是为了渺茫的机会抓住非常愚蠢的恐怖分子.哦等等 - 我们实际上是这样做的.但是,让我们看看我们是否不能在woot.com上这样做.
要求3:避免"军备竞赛":
正如你所提到的,你不想陷入spambot军备竞赛.因此,您不能使用隐藏或混乱的表单字段,数学问题等简单的调整,因为它们本质上是默默无闻的措施,可以轻易地自动检测和规避.
要求4:阻止"警报"机器人:
这可能是您最难的要求.即使我们能够进行有效的人工验证挑战,机器人仍然可以轮询您的首页,并在有新的优惠时提醒脚本编写者.我们想让这些机器人也不可行.这是第一个要求的更强版本,因为不仅机器人不能发出对性能有害的快速请求 - 他们甚至无法发出足够的重复请求以及时向脚本编写者发送"警报"以获胜报价.
好的,如果我们能够满足所有四个要求,那就让我们开始吧.首先,正如我所提到的,没有任何措施可以做到这一点.你将不得不结合几个技巧来实现它,你将不得不吞下两个烦恼:
我意识到这些很烦人,但是如果我们能够让'小'数字足够小,我希望你会同意积极因素超过负面因素.
第一项措施:基于用户的限制:
这个是不费脑子的,我相信你已经做到了.如果用户已登录,并且每秒刷新600次(或某事),则会停止响应并告诉他冷却它.事实上,你可能会比这更快地限制他的请求,但你明白了.这样,登录的机器人一旦开始轮询您的站点就会被禁止/限制.这是简单的部分.未经验证的机器人是我们真正的问题,所以对他们来说:
第二项措施:几乎每个人都建议采用某种形式的IP限制:
无论如何,你将不得不做一些基于IP的限制来阻止'bot slamming'.由于允许未经身份验证(未登录)的访问者获得特殊优惠对您来说似乎很重要,因此您最初只能使用IP,尽管它们并不完美,但它们确实可以对抗单IP机器人.僵尸网络是一个不同的野兽,但我会回到那些.目前,我们将进行一些简单的节流以击败快速单IP机器人.
如果在所有其他处理之前运行IP检查,使用代理服务器进行限制逻辑,并将IP存储在memcached查找优化树结构中,则性能损失可以忽略不计.
第三项措施:使用缓存响应隐藏油门:
随着快速单一IP机器人受到限制,我们仍然必须解决慢速单IP机器人,即.专门调整以"在雷达下飞行"的机器人通过间隔请求稍微远离节流防止.
要立即渲染慢速单IP机器人,只需使用abelenky建议的策略:将10分钟的缓存页面提供给过去24小时内(或左右)发现的所有IP.这样,每个IP每天/每小时/每周获得一次'机会'(取决于您选择的时间段),并且对于刚刚"重新加载"的真实用户没有明显的烦恼,除非他们没有获胜报价.
这项措施的美妙之处在于它也可以阻止"警报机器人",只要它们不是来自僵尸网络.
(我知道你可能更喜欢它,如果允许真正的用户一遍又一遍地刷新,但没有CAPTCHA或类似的东西,没有办法告诉一个刷新垃圾邮件的人从一个请求垃圾邮件机器人分开)
第四项措施:reCAPTCHA:
你是对的,CAPTCHAs会伤害用户体验,应该避免.然而,在一个情况下,他们可以成为你最好的朋友:如果你设计了一个非常严格的系统来阻止机器人,那么 - 由于其限制性 - 也会引发一些误报; 然后作为最后手段的CAPTCHA 将允许那些被抓住的真实用户滑过你的限制(从而避免烦人的DoS情况).
当然,最好的选择是所有的机器人都被你的网捕获,而极少数真正的用户会受到CAPTCHA的困扰.
如果您在提供10分钟的缓存页面时,还提供了另一种可选的 CAPTCHA验证的"首页复习",那么真正想要保持刷新的人仍然可以在不获取旧的缓存页面的情况下这样做,但代价是必须为每次刷新解决CAPTCHA.这是一个烦恼,但是对于顽固的用户而言是一个可选的,他们往往更宽容,因为他们知道他们正在游戏系统以提高他们的机会,并且改善的机会不会自由.
第五招:诱饵废话:
克里斯托弗·马汉(Christopher Mahan)有一个我很喜欢的想法,但我会对它不同.每当你准备一个新的报价时,还准备另外两个"优惠",没有人会选择,就像一个12毫米的翅膀,20美元.当优惠出现在首页时,将所有三个"优惠"放在同一张图片中,其中的数字与每个优惠相对应.当用户/机器人实际上订购物品时,他们将不得不挑选(一个单选按钮)他们想要的报价,并且因为大多数机器人只是猜测,在三分之二的情况下,机器人将购买毫无价值垃圾.
当然,这并没有解决'闹钟机器人',并且有一个(苗条的)机会,有人可以建立一个能够选择正确项目的机器人.然而,意外购买垃圾的风险应该使脚本完全转向完全自动化的机器人.
第六项措施:僵尸网络节流:
[删除]
好的............我现在已经花了很多时间考虑这个问题,尝试不同的方法......全球延迟......基于cookie的代币......排队服务... '陌生人扼杀'......它只是不起作用.它没有.我意识到你没有接受任何答案的主要原因是没有人提出阻止分布式/僵尸网络/僵尸网络攻击的方法......所以我真的想破解它.我相信我在另一个线程中破解了用于身份验证的僵尸网络问题,所以我对你的问题寄予厚望.但我的方法并未转化为此.您只能拥有IP,并且在任何基于IP地址的分析中都没有足够大的僵尸网络.
所以你有它:我的第六个措施是徒劳的.没有.压缩.除非僵尸网络很小和/或足够快以至于陷入通常的IP限制,否则我看不到任何针对僵尸网络的有效措施,这些措施不涉及明确的人工验证,例如CAPTHA.对不起,我认为结合上述五项措施是最好的选择.而且你可能只用abelenky的10分钟缓存技巧就可以了.
如何引入需要人工交互的延迟,比如一种"CAPTCHA游戏".例如,它可能是一个小小的Flash游戏,在30秒内他们必须爆破方格球并避免爆破实心球(避免色盲问题!).游戏将被赋予随机数种子,并且游戏发送回服务器的将是点击点的坐标和时间戳以及使用的种子.
在服务器上,您使用该种子模拟游戏机制,以查看点击是否确实会破坏球.如果他们这样做,他们不仅是人类,而且还需要30秒才能验证自己.给他们一个会话ID.
你让那个会话ID做它喜欢的东西,但是如果请求太多,它们就不能再继续播放.
已经发布了一些其他/更好的解决方案,但为了完整性,我想我会提到这个:
如果您的主要关注点是性能下降,并且您正在寻找真正的锤击,那么您实际上正在处理DoS攻击,您应该尝试相应地处理它.一种常见的方法是在每秒/分钟/等的多个连接之后简单地从防火墙中的IP丢弃分组.例如,标准Linux防火墙iptables具有标准操作匹配函数'hashlimit',可用于将每个时间单元的连接请求与IP地址相关联.
虽然,这个问题可能更适合上一次SO-podcast中提到的下一个SO衍生物,它尚未推出,所以我想可以回答:)
编辑:
正如novatrust所指出的,仍然有ISP实际上没有为他们的客户分配IP,所以有效地,这样的ISP的脚本客户将禁用该ISP的所有客户.
首先,根据定义,不可能支持无状态(即真正匿名)交易,同时又能够将机器人与合法用户分开。
如果我们可以接受一个前提,即我们可以对全新的 woot 访问者的首页点击施加一些成本,我想我有一个可能的解决方案。由于缺乏更好的名称,我将将此解决方案宽松地称为“访问 DMV”。
假设有一家汽车经销商每天提供不同的新车,并且在某些日子,您可以以每辆 5 美元的价格购买一辆异国情调的跑车(限 3 辆),外加 5 美元的目的地费用。
问题是,经销商要求您前往经销店并出示有效的驾驶执照,然后才允许您进门查看正在出售的汽车。此外,您必须出示有效的驾驶执照才能进行购买。
因此,第一次来这家汽车经销商的访客(我们暂且称他为鲍勃)会被拒绝进入,并被转介到 DMV 办公室(位于隔壁,交通便利)获取驾驶执照。
其他持有有效驾驶执照的游客在出示驾驶执照后即可进入。一个整天闲逛、缠着推销员、抢小册子、喝光免费咖啡和饼干而惹麻烦的人最终会被拒之门外。
现在,回到没有驾照的鲍勃——他所要做的就是忍受一次 DMV 的访问。之后,他可以随时前往经销店购买汽车,除非他不小心将钱包落在家里,或者他的驾照被销毁或吊销。
这个世界上的驾驶执照几乎不可能伪造。
访问 DMV 时首先需要在“从这里开始”队列中获取申请表。鲍勃必须将填好的申请表带到 1 号窗口,在那里,众多乖戾的公务员中的第一个将接受他的申请,对其进行处理,如果一切正常,则在该窗口的申请表上盖章,然后将他发送到下一个窗口。因此,鲍勃从一个窗口走到另一个窗口,等待他的申请的每一步完成,直到他最终到达终点并收到他的驾驶执照。
试图“短路”DMV 是没有意义的。如果表格填写不正确,一式三份,或者在任何窗口给出错误答案,申请表将被撕毁,倒霉的客户将被送回起点。
有趣的是,无论办公室有多满或多空,在每个连续窗口获得服务所需的时间大约相同。即使你是队列中唯一的人,工作人员似乎也喜欢让你在黄线后面等一分钟,然后才说:“下一个!”
然而,DMV 的情况并没有那么糟糕。在等待和处理获取驾照的过程中,您可以在 DMV 大厅观看汽车经销店的非常有趣且信息丰富的电视广告。事实上,该信息片的播放时间刚好足以涵盖您获得驾照所花费的时间。
稍微技术性一点的解释:
正如我在最上面所说,有必要在客户端-服务器关系上有一定的状态性,这样您就可以将人类与机器人分开。您希望以一种不会过度惩罚匿名(未经身份验证)人类访问者的方式进行此操作。
这种方法可能需要 AJAX-y 客户端处理。一个全新的 woot 访客会收到“欢迎新用户!”的提示。充满文本和图形的页面(通过适当的服务器端限制)需要几秒钟才能完全加载。当这种情况发生时(访问者可能正忙着阅读欢迎页面),他的识别令牌正在慢慢组装。
假设,为了讨论,令牌(又名“驾驶执照”)由 20 个块组成。为了获取每个连续的块,客户端代码必须向服务器提交有效的请求。服务器故意延迟(假设200 毫秒),然后发送下一个块以及发出下一个块请求所需的“标记”(即,从一个 DMV 窗口到下一个窗口所需的标记)。总而言之,必须经过大约 4 秒才能完成块-挑战-响应-块-挑战-响应-...-块-挑战-响应-完成过程。
在此过程结束时,访问者将获得一个令牌,该令牌允许他转到产品描述页面,然后转到购买页面。该令牌是每个访问者的唯一 ID,可用于限制其活动。
在服务器端,您只接受来自具有有效令牌的客户端的页面视图。或者,如果每个人最终都能看到该页面很重要,请对缺少有效令牌的请求进行时间惩罚。
现在,为了使这对合法的人类访问者相对有利,需要使令牌发行过程在后台相对非侵入性地发生。因此,欢迎页面需要故意稍微放慢速度,并带有有趣的文案和图形。
这种方法会强制限制机器人使用现有令牌,或者花费最短的设置时间来获取新令牌。当然,这对于抵御使用分布式虚假访问者网络的复杂攻击没有多大帮助。