如何保护网站免受批量抓取/下载?

时间:2011-08-01 09:27:31

标签: php mysql apache web-scraping downloading

我有运行网站的LAMP服务器,我希望防止批量抓取/下载。我知道没有完美的解决方案,攻击者总能找到办法。但我希望至少有一些“保护”能够加强窃取数据的方式,而不是一无所有。

本网站有cca。 5000个子页面,每页都有宝贵的文本数据和几张图片。我希望能够在线分析传入的HTTP请求,如果存在可疑活动(例如,一分钟内来自一个IP的数十个请求),它将自动将此特定IP地址列入黑名单,以进一步访问该站点。

我完全意识到我所要求的有许多缺陷,但我并不是真的在寻找防弹解决方案,而只是一种如何限制脚本小子从轻松抓取数据“玩”的方法。

感谢您提供主题答案和可能的解决方案。

7 个答案:

答案 0 :(得分:2)

虽然这是一篇相当古老的文章,但我认为答案并不完全,我认为值得加上我的两分钱。首先,我同意@symcbean,尽量避免使用IP,而是使用会话,cookie或其他方法来跟踪个人。否则,您可能会将共享IP的用户组混为一谈。最常见的速率限制方法,基本上就是你所描述的"一分钟内来自一个IP"的数十个请求,正在使用the leaky bucket algorithm

打击网络抓取工具的其他方法有:

  • Captchas
  • 使您的代码难以解释,并经常更改。这使得脚本难以维护。
  • 下载已知垃圾邮件发送者,代理服务器,TOR退出节点等的IP列表。这将是一个冗长的列表,但它是一个很好的起点。您可能还希望阻止所有亚马逊EC2 IP。

此列表和速率限制将阻止简单的脚本小子,但任何具有中等脚本编写经验的人都可以轻松绕过你。单独打击刮刀是徒劳的,但我的观点有偏见,因为我是Distil Networks的联合创始人,提供防刮保护作为服务。

答案 1 :(得分:1)

推荐人检查是一种非常简单的技术,可以很好地抵御自动攻击。如果引荐来源是您自己的域(即用户通过单击您自己网站上的链接到达该页面),则通常会提供内容,但如果未设置引荐来源,则可以提供备用内容(例如未找到404)

当然你需要设置它以允许搜索引擎读取你的内容(假设你想要那个)并且还要注意,如果你有任何flash内容,那么引用者永远不会被设置,所以你不能使用它方法。

此外,这意味着您网站的任何深层链接都无法正常运行 - 但也许您还想要这样做?

您也可以为图片启用它,这使得从网站上抓取它们更加困难。

答案 2 :(得分:1)

很抱歉 - 但是我不知道现有的任何反吸收代码可以做得很好。

如何在不给合法用户带来负担的情况下限制访问权限/如何提供管理站点的机制?与垃圾邮件预防一样,最好的解决方案是使用多种方法并保持很多不良。

您已经提到了查看请求的速度 - 但请记住,越来越多的用户将从NAT网络连接 - 例如IPV6弹出。更好的方法是检查每个会话 - 您不需要要求您的用户注册和登录(尽管openId使这更简单),但是只要他们在没有当前会话的情况下发出请求,您就可以将它们重定向到定义的起始点并使用没有用户名/密码登录。检查referer(并且referer确实指向当前内容项)也是一个好主意。跟踪404费率。道路障碍(当分数超过阈值时重定向到capcha或需要登录)。检查用户代理可以指示攻击 - 但应该用作评分机制的一部分,而不是阻止的是/否标准。

另一种方法是触发阈值start substituting content,而不是中断流程。或者当您在referer标题中出现重复的外部主机时也这样做。

除非你有很多资源服务器,否则不要tar连接!

答案 3 :(得分:0)

我在某些网站上使用的东西是阻止已知的下载程序或归档程序的用户代理。你可以在这里找到它们的列表:http://www.user-agents.org/(不幸的是,不容易按类型排序:D)。在主机的设置中,我列举了我不想要的东西:

SetEnvIf User-Agent ^Wget/[0-9\.]* downloader

然后我可以在适当的地方做Deny from env=downloader。当然,改变用户代理并不困难,但如果通过我的日志有任何迹象,至少它有点威慑。

如果你想按照每分钟或类似的要求进行过滤,我认为在apache中没有办法做到这一点。我有一个与ssh和saslauth类似的问题,所以我写了一个脚本来监控日志文件,如果在一定时间内有一定数量的失败登录尝试,它附加了一个阻止该IP访问的iptables规则那些港口。

答案 4 :(得分:0)

如果您不介意使用API​​,可以尝试我们的https://ip-api.io

它聚合了代理,TOR节点和垃圾邮件发送者的已知IP地址的几个数据库。

答案 5 :(得分:-1)

我会建议两件事之一,

首先,如果您有其他人想要的信息,请以受控方式(例如API)将其提供给他们。

第二种方法是尝试复制谷歌,如果你刮掉谷歌ALOT的结果(我的意思是每秒几百次),那么它会注意到它并强迫你进入验证码。

我会说,如果一个网站每秒访问10次,它可能是一个机器人。所以给它一个Captcha以确定。

如果机器人以较慢的速度每秒10次抓取您的网站,我认为没有理由尝试阻止它。

答案 6 :(得分:-2)

如果触发限制,您可以使用计数器(数据库或会话)并重定向页面。

/**Pseudocode*/  
if( ip == currIp and sess = currSess)  
       Counter++;    
if ( Count > Limit )  
    header->newLocation;  

我认为使用IP阻止程序动态阻止IP会有所帮助。