如何实现像SO一样的CAPTCHA?
如果您正常使用该网站,您可能永远不会看到一个.如果您碰巧经常重新加载同一页面,过快地发布连续评论,或者触发警报的其他内容,请让他们证明他们是人.在您的情况下,这可能是对同一页面的不断重新加载,快速跟踪页面上的每个链接,或者填写订单形式太快而不能成为人类.
如果它们连续x次失败(例如,2或3),则给该IP超时或其他此类措施.然后在超时结束时,再将它们转储回检查.
由于您有未注册的用户访问该站点,因此您只能使用IP.您可以向每个浏览器发出会话,并根据需要跟踪.当然,如果连续创建(重新)创建太多会话(如果机器人不断删除cookie),则抛出人工检查.
至于捕获太多无辜者,你可以在人工检查页面上提出免责声明:"如果有太多匿名用户从同一地点查看我们的网站,也会出现此页面.我们建议您注册或登录以避免这个." (适当调整措辞.)
此外,X人从一个IP同时加载同一页面的几率是多少?如果它们很高,也许你需要一个不同的机器人警报触发机制.
编辑:另一个选择是,如果他们失败了太多次,你对产品的需求充满信心,阻止他们并让他们亲自打电话给你删除阻止.
让人们打电话似乎确实是一种愚蠢的措施,但它确保人类在计算机后面的某个地方.关键是只允许块用于一个几乎不会发生的条件,除非它是一个机器人(例如连续多次检查失败).然后它FORCES人类互动 - 拿起电话.
在回应他们给我打电话的评论时,显然这里有权衡.您是否担心确保您的用户在上市时接听几个电话?如果我非常担心产品会吸引人类用户,我就必须做出这个决定,也许会牺牲我的一小部分时间.
由于您似乎决定不让机器人占据优势,所以我相信手机可能是一个不错的选择.由于我没有从您的产品中获利,我没有兴趣接收这些电话.如果你分享一些利润,我可能会对此感兴趣.由于这是您的产品,您必须决定您的关注程度并相应地实施.
释放块的其他方式不是那么有效:超时(但是他们会在冲洗后重新淹没你的网站),长时间超时(如果真的是人类试图购买你的产品,他们是SOL并因未通过检查而受到惩罚),电子邮件(很容易通过机器人完成),传真(相同)或蜗牛邮件(花费太长时间).
当然,您可以在每次超时时使每个IP的超时时间增加.只要确保你不会无意中惩罚真正的人类.
如何实现像SO一样的CAPTCHA?
如果您正常使用该网站,您可能永远不会看到一个.如果您碰巧经常重新加载同一页面,过快地发布连续评论,或者触发警报的其他内容,请让他们证明他们是人.在您的情况下,这可能是对同一页面的不断重新加载,快速跟踪页面上的每个链接,或者填写订单形式太快而不能成为人类.
如果它们连续x次失败(例如,2或3),则给该IP超时或其他此类措施.然后在超时结束时,再将它们转储回检查.
由于您有未注册的用户访问该站点,因此您只能使用IP.您可以向每个浏览器发出会话,并根据需要跟踪.当然,如果连续创建(重新)创建太多会话(如果机器人不断删除cookie),则抛出人工检查.
至于捕获太多无辜者,你可以在人工检查页面上提出免责声明:"如果有太多匿名用户从同一地点查看我们的网站,也会出现此页面.我们建议您注册或登录以避免这个." (适当调整措辞.)
此外,X人从一个IP同时加载同一页面的几率是多少?如果它们很高,也许你需要一个不同的机器人警报触发机制.
编辑:另一个选择是,如果他们失败了太多次,你对产品的需求充满信心,阻止他们并让他们亲自打电话给你删除阻止.
让人们打电话似乎确实是一种愚蠢的措施,但它确保人类在计算机后面的某个地方.关键是只允许块用于一个几乎不会发生的条件,除非它是一个机器人(例如连续多次检查失败).然后它FORCES人类互动 - 拿起电话.
在回应他们给我打电话的评论时,显然这里有权衡.您是否担心确保您的用户在上市时接听几个电话?如果我非常担心产品会吸引人类用户,我就必须做出这个决定,也许会牺牲我的一小部分时间.
由于您似乎决定不让机器人占据优势,所以我相信手机可能是一个不错的选择.由于我没有从您的产品中获利,我没有兴趣接收这些电话.如果你分享一些利润,我可能会对此感兴趣.由于这是您的产品,您必须决定您的关注程度并相应地实施.
释放块的其他方式不是那么有效:超时(但是他们会在冲洗后重新淹没你的网站),长时间超时(如果真的是人类试图购买你的产品,他们是SOL并因未通过检查而受到惩罚),电子邮件(很容易通过机器人完成),传真(相同)或蜗牛邮件(花费太长时间).
当然,您可以在每次超时时使每个IP的超时时间增加.只要确保你不会无意中惩罚真正的人类.
你需要想办法让机器人购买价格过高的东西:12毫米的翅膀:20美元.看看在脚本编写者决定你正在游戏之前抢占了多少机器人.
利用这些利润购买更多服务器并支付带宽.
我的解决方案是通过为"机器人和脚本"提供大约10分钟的延迟来使屏幕抓取毫无价值.
这是我如何做到的:
记录并识别任何重复击球手.
您不需要在每次点击时记录每个IP地址.每20次点击左右只跟踪一次.重复犯罪者仍会出现在随机的偶然跟踪中.
在大约10分钟前保留页面缓存.
当一个重复的击球手/机器人击中你的网站时,给他们10分钟的旧缓存页面.
他们不会马上知道他们会得到一个旧网站.他们将能够抓住它,以及一切,但他们不会再赢得任何比赛,因为"真正的人"将有10分钟的领先优势.
优点:
没有用户的麻烦或问题(如CAPTCHAs).
在服务器端完全实现.(不依赖于Javascript/Flash)
提供较旧的缓存页面的性能要低于实时页面.实际上,您可以通过这种方式降低服务器的负载!
缺点
需要跟踪一些IP地址
需要保留和维护旧页面的缓存.
你怎么看?
在这里看看这篇由Ned Batchelder撰写的文章.他的文章是关于停止垃圾邮件,但相同的技术可以很容易地适用于您的网站.
我们可以通过让机器人难以成功发布,或让他们无意中将自己标识为机器人,而不是通过让人们识别自己来阻止机器人.这消除了人们的负担,并使评论表格不受可见的反垃圾邮件措施的影响.
这种技术是我如何防止这个网站上的垃圾邮件.有用.这里描述的方法根本不看内容.
其他一些想法:
创建一个官方自动通知机制(RSS feed?Twitter?),人们可以在您的产品上市时订阅.这减少了人们制作脚本的需要.
在新商品上市之前更改您的混淆技术.因此,即使脚本编写者可以升级军备竞赛,他们总是落后一天.
编辑:要完全清楚,Ned上面的文章描述了通过阻止BOT通过表单提交订单来防止自动购买项目的方法.他的技术对于防止机器人屏幕抓取主页以确定何时出售Bandorer of Carrots是没有用的.我不确定防止那是真的可能.
关于你对Ned策略有效性的评论:是的,他讨论了蜜罐,但我不认为这是他最强的策略.他对SPINNER的讨论是我提到他的文章的原因.对不起,我在原帖中没有说清楚:
微调器是一个隐藏的字段,用于一些事情:它汇集了许多防止篡改和重放的值,并用于模糊字段名称.微调器是MD5哈希:
时间戳,
客户端的IP地址,
被评论的博客条目的条目ID,和
一个秘密.
以下是您在WOOT.com上实现的方法:
每次新项目开始销售时,更改用作哈希部分的"秘密"值.这意味着如果有人要设计BOT来自动购买物品,它只会在下一个物品上市之前有效!
即使有人能够快速重建他们的机器人,所有其他实际用户也已经购买了BOC,您的问题就解决了!
他讨论的另一个策略是不时更改蜜罐技术(再次,当新产品上市时更改它):
使用CSS类(当然是随机的)来设置字段或包含要显示的元素:none.
为与页面背景相同(或非常相似)的字段着色.
使用定位将字段移出页面的可见区域.
使元素太小,无法显示包含的蜜罐字段.
保持字段可见,但使用定位用遮蔽元素覆盖它们.
使用Javascript来实现任何这些更改,要求机器人拥有完整的Javascript引擎.
让蜜罐像其他字段一样显示,但告诉人们不要在其中输入任何内容.
我想我的总体想法是在每件新商品上市时更换表格设计.或者至少在新BOC上市时更改它.
这是什么,几次/月?
如果你接受这个答案,你会在下一个到期时给我一个预告吗?:)
问:你如何阻止脚本编写者每秒数百次抨击你的网站?
答:你没有.外部代理无法阻止此行为.
您可以使用大量技术来分析传入的请求,然后尝试确定谁是和不是人......但它会失败.最终,如果没有立即.
唯一可行的长期解决方案是改变游戏,使网站不是机器人友好的,或者对脚本编写者不那么有吸引力.
你是怎样做的?嗯,这是一个不同的问题!;-)
...
好的,上面已经给出(并拒绝)了一些选项.我对你的网站并不十分熟悉,只看过一次,但由于人们可以阅读图片中的文字而机器人不能轻易做到这一点,所以将公告更改为图像.不是CAPTCHA,只是一张图片 -
请求页面时生成图像(当然是缓存)
保持图像源名称相同,这样就不会让游戏消失
大多数情况下,图像中将包含普通文本,并且对齐以显示为内联HTML页面的一部分
当游戏"开启"时,图像会变为公告文本
公告文本显示必须手动输入以获取奖品的网址和/或代码.如果你愿意,可以使用CAPTCHA代码,但这可能不是必需的.
为了提高安全性,代码可以是专门为请求/ IP /代理生成的一次性令牌,以便重复请求生成不同的代码.或者,如果按需生成过于繁重,您可以预先生成一堆随机代码(一次性填充).
对真实的人做出响应的时间试验,忽略('哎呀,发生错误,抱歉!请再试一次')响应的速度比(比如说)这段时间的一半要快.此事件还应触发开发人员警告至少一个机器人已经找到代码/游戏,因此是时候更改代码/游戏了.
无论如何,即使没有机器人触发它,也要继续定期更改游戏,只是为了浪费脚本编写者的时间.最终脚本编写者应该厌倦游戏并去其他地方...我们希望;-)
最后一个建议是:当您的主页请求进入时,将其放入队列并在单独的进程中按顺序响应请求(您可能必须破解/扩展Web服务器才能执行此操作,但它可能会值得).如果第一个请求在队列中时来自同一IP /代理的另一个请求进入,则忽略它.这应该会自动减轻机器人的负担.
编辑:除了使用图像之外,另一个选择是使用javascript填写买/不买文; 机器人很少解释javascript,所以他们不会看到它
我不知道这有多可行:......继续进攻.
找出机器人扫描的数据.当你不卖垃圾时,给他们提供他们正在寻找的数据.以不会打扰或混淆人类用户的方式执行此操作.当机器人触发第二阶段时,他们将登录并填写表格以购买100美元的roombas而不是BOC.当然,这假设机器人不是特别健壮.
另一个想法是在袋子销售期间实施随机价格下降.当你明确指出它只值20美元时,谁会以150美元的价格购买随机包装?没有人,但过于热心的机器人.但是9分钟后它就是35美元......然后17分钟后它就是9美元.管他呢.
当然,僵尸国王能够做出反应.重点是让他们的错误对他们来说变得非常昂贵(并让他们付钱给你打他们).
所有这一切都假设你想要惹恼一些机器人领主,这可能不是100%可取的.
所以问题实际上似乎是:机器人想要他们的"袋子"垃圾,因为它具有低感知价格的高感知价值.你有时提供这个项目和机器人潜伏,等待它是否可用,然后他们购买该项目.
由于看起来机器人所有者正在赚取利润(或潜在地赚取利润),所以诀窍是通过鼓励他们购买废话来使这对他们无利可图.
首先,总是提供"袋子'废话".
其次,确保垃圾通常是垃圾.
第三,经常旋转垃圾.
简单,不是吗?
你需要一个永久的"为什么我们的垃圾有时会废话?" 提供旁边的链接,向人们解释正在发生的事情.
当机器人看到有废话并且废话被自动购买时,收件人会非常不安,因为他们已经为破牙签支付了10美元.然后是一个空的垃圾袋.然后是鞋底的一些污垢.
如果他们在相对较短的时间内购买了足够的垃圾(并且你在整个地方都有大量免责声明解释你为什么要这样做),那么他们将会失去一个公平的"袋子"现金" bag'o crap".如果你经常旋转垃圾,即使是人为干预(检查以确保垃圾不是垃圾)也会失败.哎呀,也许机器人会注意到并且不会购买旋转时间太短的任何东西,但这意味着人类将购买非垃圾.
哎呀,你的老顾客可能会觉得很有趣,你可以把它变成一个巨大的营销胜利.开始发布有多少"垃圾"鲤鱼被出售.人们会回来看看机器人被咬的有多难.
更新: 我希望你可能会在人们抱怨的情况下预先打几个电话.我认为你不能完全阻止它.但是,如果这会杀死机器人,您可以随时停止它并稍后重新启动它.
将该项目出售给非脚本人类.
保持网站以不受机器人减速的速度运行.
不要为完成任何任务而对"正常"用户进行麻烦,以证明他们是人.
你可能不想听到这个,但#1和#3是相互排斥的.
好吧,没有人知道你也是一个机器人.没有程序方法可以告诉连接的另一端是否有人,而不需要该人做某事.阻止脚本/机器人在网上做事是CAPTCHAs发明的全部原因.这并不是说这是一个没有花费大量精力的新问题.如果有一个更好的方法,一个不涉及CAPTCHA真正用户的麻烦,每个人都会使用它.
我认为你需要面对这样一个事实:如果你想让机器人关闭你的订购页面,一个好的CAPTCHA是唯一的方法.如果对你的随机垃圾的需求足够高以至于人们愿意花这些时间来获得它,那么合法用户就不会被CAPTCHA推迟.
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(我发现的唯一一个不容易被愚弄的,但对你的应用来说可能太慢了),并考虑稍微改变模型的方法普通用户有机会用户的机会.
-亚当
免责声明:这个答案完全与非编程相关.但是,它确实试图首先攻击脚本的原因.
另一个想法是,如果你真的有限量出售,为什么不从先到先得的方法改变它?当然,除非炒作是您营销计划的一部分.
还有很多其他选择,我相信其他人可以想到一些不同的选择:
排序队列(预订系统) - 某些脚本可能仍然在队列的前面,但是手动输入信息可能更快.
抽奖系统(每个试图订购一个的人都会进入系统) - 这样,拥有脚本的人与没有脚本的人有相同的机会.
优先排队 - 如果确实有很高的感知价值,人们可能愿意支付更多.实现一个排序队列,但允许人们支付更多费用以置于队列中更高的位置.
拍卖(大卫施密特为此拍卖,评论是我自己的) - 人们仍然可以在最后一分钟使用脚本进行狙击,但不仅会改变定价结构,人们也期望与其他人一起抗争.您还可以做一些事情来限制给定时间段内的出价数量,让人们提前拨打授权码等等.
无论纳粹认为他们的通信有多么安全,盟友往往会打破他们的信息.无论你如何阻止机器人使用你的网站,机器人所有者都会找到解决方法.对不起,如果这让你成为纳粹分子:-)
我认为需要一种不同的心态
不要试图阻止机器人使用您的网站
不要去寻找立即行动的修复,玩长游戏
深入思考,无论您的网站的客户是人还是机器人都无关紧要,两者都只是付费客户; 但是一个人比另一个人有不公平的优势.一些没有太多社交生活(隐士)的用户可能会像您的网站其他用户一样烦恼.
记录您发布优惠的时间以及帐户选择购买优惠的时间.
这可以让您记录客户购买东西的速度.
改变您发布优惠的时间.
例如,有一个3小时的窗口从一天的某个模糊时间开始(午夜?)只有机器人和隐士会不断刷新页面3小时,只是为了在几秒钟内获得订单.永远不要改变基准时间,只改变窗户的大小.
随着时间的推移,将出现一幅画面.
01:您可以看到哪些帐户在他们上线后的几秒钟内定期购买产品.建议他们可能是机器人.
02:您还可以查看优惠所用的时间窗口,如果窗口是1小时,那么一些早期买家将是人类.但是人类很少会刷新4小时.如果发布/购买之间的经过时间非常一致,无论窗口持续时间如何,那么这就是机器人.如果小窗口的发布/购买时间很短,而大窗户的发布/购买时间会更长,那就是隐士!
现在,您没有停止机器人使用您的网站,而是有足够的信息告诉您机器人当然使用了哪些帐户,以及隐士可能会使用哪些帐户.您对这些信息的处理取决于您,但您当然可以使用它来使您的网站更贴近有生命的人.
我认为禁止机器人帐户将毫无意义,这类似于打电话希特勒并说"感谢你的U艇的位置!" 不知何故,您需要以帐户所有者不会意识到的方式使用这些信息.让我们看看我是否可以梦想......
处理队列中的订单:
当客户下订单时,他们会立即收到一封确认电子邮件,告知他们将订单放入队列中,并在处理完毕后收到通知.我在亚马逊上通过订单/发送来体验这种事情,它根本不会打扰我,我不介意几天后收到一封电子邮件告诉我我的订单已经发送,只要我立即收到一封电子邮件告诉我亚马逊知道我想要这本书.在你的情况下,它将是一封电子邮件
您的订单已下订单并且已排入队列.
您的订单已处理完毕.
您的订单已派出.
用户认为他们在公平的队列中.每隔1小时处理一次队列,以便普通用户也会遇到队列,以免引起怀疑.只有从机器人和隐士帐户处理订单,一旦他们已经在队列中"人类平均订购时间+ X小时".有效减少机器人的机器人.
我说使用API公开价格信息.这是不直观的解决方案,但它可以帮助您控制情况.为API添加一些限制,使其功能略逊于网站.
你也可以这样做订购.您可以尝试对API功能/性能进行小的更改,直到获得所需的效果.
有代理和僵尸网络可以打败IP检查.有一些非常好的验证码阅读脚本.印度甚至有一些工人团队以很低的价格击败验证码.您可以提出的任何解决方案都可以合理地失败.甚至Ned Batchelder的解决方案也可以通过使用WebBrowser控件或其他模拟浏览器以及僵尸网络或代理列表来解决.
我们目前正在使用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的所有客户.
在应用程序前面的apache服务器上编写反向代理,实现Tarpit (维基百科文章)来惩罚机器人.它只会管理在过去几秒内连接的IP地址列表.您从单个IP地址检测到一连串请求,然后在响应之前以指数方式延迟这些请求.
当然,如果他们在NAT'd网络连接上,多个人可以来自相同的IP地址,但是人们不太可能会想到你的响应时间为2mS到4mS(甚至400mS),而机器人将受到阻碍通过越来越多的延迟很快.