如何检测通过Tor匿名发送的入站HTTP请求?

6
我正在开发一个网站,很担心我的数据被人屏幕抓取。我并不担心抓取一两页 -- 我更关注的是某个人抓取数千页的数据,因为这些数据的聚合比小部分数据要有价值得多。
我可以想象出一些策略来阻止基于单个IP地址的大量流量的用户,但Tor网络建立了许多电路,从本质上来说,一个单独用户的流量看起来像随时间变化的不同IP地址的流量。
我知道检测Tor流量是可能的,因为当我安装了Vidalia和它的Firefox扩展时,google.com向我呈现了一个验证码。
那么,我该如何检测这样的请求?
(我的网站使用ASP.NET MVC 2构建,但我认为这里使用的任何方法都与语言无关)
6个回答

15

我正在开发一个网站,并且非常关注有人会屏幕抓取我的数据

这个没必要太在意。如果你的数据存在于互联网上,任何人想要获取它都是不可阻挡的。你加入越多的限制,就会越有可能破坏合法用户的体验,而合法用户应该是你受众中的大多数。这样还会使代码更难维护。

如果有未来回答的想法,我会发布对应的对策。


2
我同意Aillyn的观点;阻止别人从您的网站屏幕抓取数据几乎是不可能的。追求防止它的选项只会浪费更好地用于改善您的网站其他方面的时间。专注于使您的网站独特且优于屏幕抓取程序的内容。例如,看看Stack Overflow:它被大量的无底部用户抓取,但这并不妨碍它成为有用而棒极了的网站。 - Cal Jacobson
@Cal 他们甚至不需要进行爬取,这些内容可以通过数据转储获得。 - Aillyn
@Cal,SO数据可以在Creative Commons下载 http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump/。 - Drew Noakes
1
@Aillyn,我同意你的观点,阻止人们获取数据是不可能的。我只是希望让他们很难这样做。我可以想象出非常简单的阻止行为,不会影响任何人类访问者,但如果有人使用Tor网络或其他分布式代理,这种方法就会失效。感谢您的回答,尽管没有鼓励 :) - Drew Noakes
@Aillyn,Drew--啊,我不知道。然而,我认为这只是加强了我的观点:尽管内容很容易获取,但SO提供了模仿者无法提供的东西。也许这只是声誉问题。也许是时效性。也许是设计。也许是普通用户可以发现那些垃圾 knock-offs,看到它们的真面目,并选择支持真正的产品。无论是什么,Drew,请不要因为屏幕抓取而阻止您继续推进您的网站。 - Cal Jacobson
1
@Drew 我用了一种服务,不让人们复制他们的内容。除了大量的法律术语(例如:如果你复制我们的内容,你将遭受法律最严厉的迫害),该程序运行在Java中,并清除剪贴板,并检查正在运行的图像捕获程序。非常烦人。我只是安装了一个抓包工具,保存了所有他们的SOAP响应。不仅我有了这些数据,而且我还以非常可用的、编程友好的格式拥有它。然后我匿名发布了这些内容。所以,不要这样做。 - Aillyn

5
您可以将其IP地址与Tor Exit Nodes列表进行比对。但实际情况是,这并不能阻止那些想要抓取您网站信息的人。Tor速度太慢了,大多数抓取工具都不会选择使用。而成千上万个开放代理服务器则可以轻易被扫描到或通过购买列表获取。使用代理服务器好处在于可以进行线程处理或者轮换以避免触发请求限制。
由于Tor用户滥用Google,大部分出口节点已在Google黑名单中,因此您可能会出现验证码。
请注意:没有任何方法能够完全防止别人抓取您的网站。

Tor在延迟方面较慢,但您可以轻松地将负载分散到并发请求中,以获得相同的净吞吐量。 - Drew Noakes
2
@Drew Noakes 我不同意,代理服务器绝对是最佳选择,更快且对IP地址的控制更强。此外,顺便说一句,IP地址很便宜,就像几分钱一样,你可以购买大量的地址然后攻击某些网站。你需要构建一个适用于互联网的商业模型。在信息时代,人们试图限制访问令我感到困惑。我有一种感觉,你接下来的问题是如何实现有效的数字版权管理(DRM)。 - rook
我理解你的观点并倾向于同意。我不是在谈论要阻止每个人,只是那些没有极大动力或能力的人。就像现代DRM阻止了大多数人从购买的音乐中学习如何去除它一样。 - Drew Noakes
2
@Drew Noakes,我觉得你没有理解我的意思。DRM根本起不到任何作用,就像这个虚假的安全系统一样。它无法阻止任何事情(如thepiratebay.com),试图阻止网络爬虫和使用DRM的想法都是由不理解的人构思出来的。 - rook
1
为此,您可以使用像Ipregistry这样的服务(免责声明:我运营该服务)来检测IP地址是否是Tor出口节点、使用代理等。然而,正如许多人之前所说,没有什么能阻止公共页面被抓取。 - Laurent

2

根据tor网络组件的设计,接收者无法确定请求者是原始来源还是中继请求。

你在Google上看到的行为可能是由不同的安全措施引起的。Google会检测登录用户是否更改了IP,并在必要时展示验证码,以防止有害拦截,并且允许已经认证的用户在真正更改IP(通过重新登录ISP等)后继续会话。


很有趣,但我不经常使用Firefox,所以我可能已经有几周没有cookie了。此外,那些通过DHCP更改人们IP地址的ISP怎么办?我不是说你错了,只是想知道他们是否跟踪Tor节点IP地址。 Vidalia在UI中显示所有中继及其IP地址的列表。也许Google监视那个列表... - Drew Noakes
Google会在cookie中设置2年的过期日期(http://googleblog.blogspot.com/2007/07/cookies-expiring-sooner-to-improve.html),所以几周前的cookie不是问题。 我不知道Google用了多少种不同的机制来识别会话,但它们非常丰富。 顺便说一句,我经常使用Google服务(每周一两次)遇到验证码来继续我的会话,而我没有使用任何匿名技术。 尽管这些情况越来越少了,我想Google学习了我正在使用的IP范围(可能类似于Lattitude位置学习)。 - Kosi2801

0

我知道这篇文章有点老了,但是我从谷歌搜索中找到了它,所以我想在这里解决一下问题的根本关注点。我开发网络应用程序,但我也滥用和利用其他人的东西。我可能是你想要阻止的那个人。

在这里检测Tor流量真的不是你想要走的路线。你可以通过解析请求头来检测大量的开放代理服务器,但你还有Tor、高匿名代理、Socks代理、直接面向垃圾邮件营销者的廉价VPN、僵尸网络和无数其他突破速率限制的方法。你也

如果你的主要担忧是DDoS效应,不用担心。真正的DDoS攻击需要肌肉或某些漏洞,这会给你的服务器带来压力。无论你有什么类型的网站,你都会受到蜘蛛的访问以及寻找漏洞的坏人的扫描。这是生活的事实。事实上,这种逻辑在服务器上几乎从来没有很好地扩展,并且可能成为单点故障,使你容易受到真正的DDoS攻击。

这也可能成为你的最终用户(包括友好的机器人)的单点故障。如果一个合法的用户或客户被阻止,你就会面临客户服务的噩梦,如果错误的爬虫被阻止,你就要和你的搜索流量说再见了。

如果你真的不想让任何人获取你的数据,有一些事情可以做。如果它是一个博客内容或其他东西,我通常建议要么不用担心,或者只需要摘要RSS提要,如果你需要提要的话。被抓取的博客内容的危险在于,很容易将文章的完全复制品发送垃圾邮件链接并对其进行排名,从而将原始文章排除在搜索结果之外。同时,因为这样做非常容易,人们不会花费精力来针对特定站点进行目标定向,而是可以批量抓取RSS提要。

如果您的网站更像是具有动态内容的服务,那就是另一回事了。我实际上会抓取很多类似这样的网站来“窃取”大量结构化专有数据,但是有一些选项可以使其更加困难。您可以限制每个IP的请求次数,但是使用代理轻松绕过此限制。相对简单的混淆可以提供一些真正的保护。如果您尝试从Google搜索结果中爬取信息或者从YouTube下载视频,您会发现反向工程有很多要做的工作。我都做过这些事情,但是99%的人失败了,因为他们缺乏相关知识。他们可以抓取代理以绕过IP限制,但是他们没有破解任何加密。

作为一个例子,据我所记,谷歌的搜索结果页面会带有混淆的JavaScript代码,在页面加载时注入到DOM中,然后设置一些令牌,因此您必须解析它们。然后使用这些令牌进行Ajax请求,返回混淆的JS或JSON,解码以构建结果等等。作为开发人员,这并不难做到,但绝大多数潜在的盗贼无法处理它。大多数能够处理的人也不会付出努力。我这样做是为了包装谷歌等真正有价值的服务,但对于大多数其他服务,我只会转向一些更容易攻击的提供者。

希望这对任何遇到此类问题的人有所帮助。


0

我认为过于强调了阻止决心坚定且技术熟练的用户从网站上爬取信息是“不可能”的。@Drew Noakes指出,该网站包含的信息在聚合后具有一定的“价值”。如果一个网站的聚合数据可以被无限制的匿名用户轻松访问,那么是的,防止爬取可能几乎是“不可能”的。

我建议解决的问题不是如何阻止用户爬取聚合数据,而是采用什么方法将聚合数据从公共访问中删除;从而消除爬虫的目标,而无需做到“不可能”的防止爬取。

聚合数据应该像专有公司信息一样对待。一般情况下,专有公司信息不会以聚合或原始形式公开提供给匿名用户。我认为,防止有价值数据的获取的解决方案是限制和约束对数据的访问,而不是在向用户呈现数据时防止其被爬取。

1] 用户账户/访问 - 永远不应该有人在给定时间段内访问所有数据(数据/域特定)。用户应该能够访问与他们相关的数据,但从问题中可以清楚地看出,没有用户有合法目的来查询所有聚合数据。如果不知道网站的具体情况,我怀疑一个合法的用户可能只需要一些小的子集数据在某个时间段内。请求显著超过典型用户需求的应该被阻止或者限制,以使抓取变得极其耗时,并且抓取的数据可能已经过时。

2] 运营团队经常监控指标以确保大型分布式和复杂系统的健康状况。不幸的是,很难确定间歇性问题的原因,甚至很难确定是否存在问题,而不是正常的操作波动。运营团队经常处理从许多指标中获取的统计分析历史数据,并将它们与当前值进行比较,以帮助识别系统健康状况的显着偏差,无论是系统正常运行时间、负载、CPU利用率等。

同样,用户请求的数据量显著高于正常水平可能有助于识别可能正在抓取数据的个人;这种方法甚至可以自动化,并进一步扩展到跨多个帐户查找指示抓取的模式。用户1抓取10%,用户2抓取接下来的10%,用户3抓取接下来的10%,等等...像这样(和其他)的模式可能提供单个个人或利用多个帐户的组对系统进行恶意使用的强烈指标。

3] 不要直接向最终用户提供原始聚合数据。具体情况很重要,但简单来说,数据应该驻留在后端服务器上,并利用某些特定领域的API进行检索。再次强调,我假设您不仅仅是提供原始数据,而是响应用户对数据子集的请求。例如,如果您拥有特定地区详细人口统计数据,则合法的最终用户只会对该数据的子集感兴趣。例如,最终用户可能想知道与父母一起居住在多单元住房中的青少年家庭的地址或特定城市或县的数据。这样的请求需要处理聚合数据以生成最终用户感兴趣的结果数据集。从众多可能的输入查询的各种排列组合中抓取每个结果数据集并重新构建完整的聚合数据将是难以承受的。网络爬虫还受到网站安全性的限制,考虑到请求/时间的数量、结果数据集的总数据大小和其他潜在标记。一个开发良好的API结合特定领域的知识将是确保API足够全面以服务于其目的但不过于通用以返回大型原始数据转储的关键。

将用户账户纳入网站,为用户建立使用基准线,识别和限制偏离典型使用模式的用户(或其他缓解方法),并创建一个界面以请求处理/消化结果集(而不是原始聚合数据),这将为有意窃取您的数据的恶意个体创造重大复杂性。防止网站数据被抓取可能是不可能的,但“不可能”是建立在聚合数据容易被抓取者访问的前提下的。你不能抓取你看不到的东西。因此,除非你的聚合数据是原始未经处理的文本(例如图书馆电子书),否则终端用户不应该访问原始聚合数据。即使在图书馆电子书的例子中,如果请求完整书籍的数量超出了可接受的使用模式,也应该被阻止或限制。

0

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