检测网页抓取的方法

时间:2011-03-20 22:53:07

标签: algorithm security screen-scraping detection

我需要在我的网站上检测信息的抓取。我尝试了基于行为模式的检测,虽然相对计算量很大,但似乎很有希望。

基础是收集某个客户端的请求时间戳,并将它们的行为模式与常见模式或预先计算的模式进行比较。

更准确地说,我将请求之间的时间间隔收集到数组中,按时间函数索引:

i = (integer) ln(interval + 1) / ln(N + 1) * N + 1
Y[i]++
X[i]++ for current client

其中N是时间(计数)限制,丢弃大于N的间隔。最初X和Y都填充了。

然后,在X和Y中获得足够数量后,是时候做出决定了。标准是参数C:

C = sqrt(summ((X[i]/norm(X) - Y[i]/norm(Y))^2)/k)

其中X是某些客户数据,Y是公共数据,norm()是校准函数,k是归一化系数,取决于norm()的类型。有3种类型:

  1. norm(X) = summ(X)/count(X), k = 2
  2. norm(X) = sqrt(summ(X[i]^2), k = 2
  3. norm(X) = max(X[i]), k is square root of number of non-empty elements X
  4. C在范围(0..1)内,0表示没有行为偏差,1表示最大偏差。

    类型1的校准最适合重复请求,类型2用于重复请求,间隔很少,类型3用于非常量请求间隔。

    你怎么看?如果您在服务上尝试这一点,我将不胜感激。

4 个答案:

答案 0 :(得分:8)

说实话,你的方法完全没有价值,因为它的琐碎旁路。攻击者甚至不必编写一行代码来绕过它。代理服务器是free,您可以在亚马逊ec2上以新的IP地址启动新机器,每小时2美分。

更好的方法是Roboo,它使用cookie技术来阻止机器人。绝大多数机器人都无法运行javascript或flash,这可以为您提供优势。

然而,所有这些“(in)security though obscurity”以及唯一理由为什么它可能会起作用是因为您的数据不值得花费5分钟的程序员。 (包括Roboo)

答案 1 :(得分:3)

如果你专门询问算法的有效性,那不是很糟糕,但似乎你已经过度复杂了。您应该使用WAF已经采用的基本方法来对连接进行速率限制。已经存在的一种这样的算法是Leaky Bucket Algorith(http://en.wikipedia.org/wiki/Leaky_bucket)。

对于停止网页抓取的速率限制,尝试对连接进行速率限制存在两个缺陷。首先是人们使用代理网络或TOR来匿名化每个请求的能力。这基本上使您的努力无效。即使是现成的刮​​削软件,如http://www.mozenda.com,也会使用大量的IP并通过它们旋转来解决这个问题。另一个问题是您可能会阻止使用共享IP的人员。公司和大学经常使用NAT,你的算法可能会误认为是一个人。

对于完全披露,我是Distil Networks的联合创始人,我们经常在WAF中挖洞,如限速。我们认为需要更全面的解决方案,因此需要我们的服务。

答案 2 :(得分:2)

我做了很多网页抓取,并且每次请求之间总是使用多个IP地址和随机间隔。

在抓取页面时,我通常只下载HTML而不是依赖项(图像,CSS等)。因此,您可以尝试检查用户是否下载了这些依赖项。

答案 3 :(得分:0)

好吧,有人可以构建一个机器人,该机器人可以进入您的网站,下载html(而不是图像,css等,如@hoju的回复所示),并为要在您的站点上遍历的链接绘制图形。

机器人可以使用随机计时来发出每个请求,并使用代理,VPN,Tor等更改每个请求中的IP。

我很想回答您可以尝试通过使用CSS(互联网上常见的解决方案)添加隐藏链接来欺骗机器人。但这不是解决方案。当机械手访问禁止链接时,您可以禁止访问该IP。但是最终您会得到大量的被禁IP。另外,如果有人开始欺骗IP并向服务器上的该链接发出请求,那么您最终可能会与世隔绝。除此以外,还可以实施一种解决方案,使机器人能够看到隐藏的链接。

我认为,一种更有效的方法是使用可检测代理,VPN,Tor等的API检查每个传入请求的IP。我在Google上搜索了“ api detection vpn proxy tor”,并发现了一些(付费)服务。也许有免费的。

如果API响应是肯定的,请将请求转发到验证码。