解析互联网网站的防爬虫策略 (解析互联网网络的特点)

教程大全 2025-07-13 18:43:02 浏览

解析互联网网站的防爬虫策略

由于搜索引擎的普及,网络爬虫已经成为一种非常流行的网络技术。除了谷歌、雅虎、微软和百度,几乎所有大型门户网站都有自己的搜索引擎。有大大小小的几十个叫的出名的,还有成千上万个不知名的。对于一个内容驱动的网站来说,网络爬虫的光顾是不可避免的。

一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几十上百个请求循环重复 抓取,这种爬虫对中小型网站往往是毁灭性打击,特别是一些缺乏爬虫编写经验的程序员写出来的爬虫破坏力极强,造成的网站访问压力会非常大,会导致网站访问 速度缓慢,甚至无法访问。

手工识别和拒绝爬虫的访问

netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n

拒绝爬虫请求既可以通过内核防火墙来拒绝,也可以在web server拒绝,比方说用iptables拒绝:

iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24

直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台 服务器 上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题。

通过识别爬虫的User-Agent信息来拒绝爬虫

有很多爬虫并不会以很高的并发连接爬取,一般不容易暴露自己;有些爬虫的来源IP分布很广,很难简单的通过封锁IP段地址来解决问题;另外还有很多 各种各样的小爬虫,它们在尝试Google以外创新的搜索方式,每个爬虫每天爬取几万的网页,几十个爬虫加起来每天就能消耗掉上百万动态请求的资源,由于 每个小爬虫单独的爬取量都很低,所以你很难把它从每天海量的访问IP地址当中把它准确的挖出来。

这种情况下我们可以通过爬虫的User-Agent信息来识别。每个爬虫在爬取网页的时候,会声明自己的User-Agent信息,因此我们就可以 通过记录和分析User-Agent信息来挖掘和封锁爬虫。我们需要记录每个请求的User-Agent信息,对于Rails来说我们可以简单的在 app/controllers/application.rb里面添加一个全局的before_filter,来记录每个请求的User-Agent信 息:

logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}"

然后统计每天的production.log,抽取User-Agent信息,找出访问量的那些User-Agent。要注意的是我们只关注那 些爬虫的User-Agent信息,而不是真正浏览器User-Agent,所以还要排除掉浏览器User-Agent,要做到这一点仅仅需要一行 shell

grep HTTP_USER_AGENT production.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.log
解析互联网网站的防爬虫策略

统计结果类似这样:

57335 HTTP_USER_AGENT Baiduspider+(+HTTP_USER_AGENT Mozilla/5.0 (compatible; Googlebot/2.1; +HTTP_USER_AGENT Mediapartners-Google19131 HTTP_USER_AGENT msnbot/2.0b (+

从日志就可以直观的看出每个爬虫的请求次数。要根据User-Agent信息来封锁爬虫是件很容易的事情,lighttpd配置如下:

$HTTP["useragent"] =~ "qihoobot|^Java|Commons-HttpClient|Wget|^PHP|Ruby|Python" {URL.rewrite = ( "^/(.*)" => "/crawler.html" )}

使用这种方式来封锁爬虫虽然简单但是非常有效,除了封锁特定的爬虫,还可以封锁常用的编程语言和HTTP类库的User-Agent信息,这样就可以避免很多无谓的程序员用来练手的爬虫程序对网站的骚扰。

还有一种比较常见的情况,就是某个搜索引擎的爬虫对网站爬取频率过高,但是搜索引擎给网站带来了很多流量,我们并不希望简单的封锁爬虫,仅仅是希望降低爬虫的请求频率,减轻爬虫对网站造成的负载,那么我们可以这样做:

$HTTP["user-agent"] =~ "Baiduspider+" {connection.delay-seconds = 10}

对百度的爬虫请求延迟10秒钟再进行处理,这样就可以有效降低爬虫对网站的负载了。

通过网站流量统计系统和日志分析来识别爬虫

有些爬虫喜欢修改User-Agent信息来伪装自己,把自己伪装成一个真实浏览器的User-Agent信息,让你无法有效的识别。这种情况下我们可以通过网站流量系统记录的真实用户访问IP来进行识别。

主流的网站流量统计系统不外乎两种实现策略:一种策略是在网页里面嵌入一段js,这段js会向特定的统计服务器发送请求的方式记录访问量;另一种策 略是直接分析服务器日志,来统计网站访问量。在理想的情况下,嵌入js的方式统计的网站流量应该高于分析服务器日志,这是因为用户浏览器会有缓存,不一定 每次真实用户访问都会触发服务器的处理。但实际情况是,分析服务器日志得到的网站访问量远远高于嵌入js方式,极端情况下,甚至要高出10倍以上。

现在很多网站喜欢采用awstats来分析服务器日志,来计算网站的访问量,但是当他们一旦采用Google Analytics来统计网站流量的时候,却发现GA统计的流量远远低于awstats,为什么GA和awstats统计会有这么大差异呢?罪魁祸首就是 把自己伪装成浏览器的网络爬虫。这种情况下awstats无法有效的识别了,所以awstats的统计数据会虚高。

其实作为一个网站来说,如果希望了解自己的网站真实访问量,希望精确了解网站每个频道的访问量和访问用户,应该用页面里面嵌入js的方式来开发自己 的网站流量统计系统。自己做一个网站流量统计系统是件很简单的事情,写段服务器程序响应客户段js的请求,分析和识别请求然后写日志的同时做后台的异步统 计就搞定了。

通过流量统计系统得到的用户IP基本是真实的用户访问,因为一般情况下爬虫是无法执行网页里面的js代码片段的。所以我们可以拿流量统计系统记录的 IP和服务器程序日志记录的IP地址进行比较,如果服务器日志里面某个IP发起了大量的请求,在流量统计系统里面却根本找不到,或者即使找得到,可访问量 却只有寥寥几个,那么无疑就是一个网络爬虫。

分析服务器日志统计访问最多的IP地址段一行shell就可以了:

grep Processing production.log | awk '{print $4}' | awk -F'.' '{print $1"."$2"."$3".0"}' | sort | uniq -c | sort -r -n | head -n 200 > stat_ip.log

然后把统计结果和流量统计系统记录的IP地址进行对比,排除真实用户访问IP,再排除我们希望放行的网页爬虫,比方Google,百度,微软msn爬虫等等。最后的分析结果就就得到了爬虫的IP地址了。以下代码段是个简单的实现示意:

whitelist = []IO.foreach("#{RAILS_ROOT}/lib/whitelist.txt") { |line| whitelist << line.split[0].strip if line }realiplist = []IO.foreach("#{RAILS_ROOT}/log/visit_ip.log") { |line|realiplist << line.strip if line }iplist = []IO.foreach("#{RAILS_ROOT}/log/stat_ip.log") do |line|ip = line.split[1].stripiplist << ip if line.split[0].to_i > 3000 && !whitelist.include?(ip) && !realiplist.include?(ip)endReport.deliver_crawler(iplist)

分析服务器日志里面请求次数超过3000次的IP地址段,排除白名单地址和真实访问IP地址,最后得到的就是爬虫IP了,然后可以发送邮件通知管理员进行相应的处理。

网站的实时反爬虫防火墙实现策略

通过分析日志的方式来识别网页爬虫不是一个实时的反爬虫策略。如果一个爬虫非要针对你的网站进行处心积虑的爬取,那么他可能会采用分布式爬取策略, 比方说寻找几百上千个国外的代理服务器疯狂的爬取你的网站,从而导致网站无法访问,那么你再分析日志是不可能及时解决问题的。所以必须采取实时反爬虫策 略,要能够动态的实时识别和封锁爬虫的访问。

要自己编写一个这样的实时反爬虫系统其实也很简单。比方说我们可以用memcached来做访问计数器,记录每个IP的访问频度,在单位时间之内, 如果访问频率超过一个阀值,我们就认为这个IP很可能有问题,那么我们就可以返回一个验证码页面,要求用户填写验证码。如果是爬虫的话,当然不可能填写验 证码,所以就被拒掉了,这样很简单就解决了爬虫问题。

用memcache记录每个IP访问计数,单位时间内超过阀值就让用户填写验证码,用Rails编写的示例代码如下:

ip_counter = Rails.cache.increment(request.remote_ip)if !ip_counterRails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)elsif ip_counter > 2000render :template => 'test', :status => 401 and return falseend

这段程序只是最简单的示例,实际的代码实现我们还会添加很多判断,比方说我们可能要排除白名单IP地址段,要允许特定的User-Agent通过,要针对登录用户和非登录用户,针对有无referer地址采取不同的阀值和计数加速器等等。

此外如果分布式爬虫爬取频率过高的话,过期就允许爬虫再次访问还是会对服务器造成很大的压力,因此我们可以添加一条策略:针对要求用户填写验证码的 IP地址,如果该IP地址短时间内继续不停的请求,则判断为爬虫,加入黑名单,后续请求全部拒绝掉。为此,示例代码可以改进一下:

before_filter :ip_firewall, :except => :testdef ip_firewallrender :file => "#{RAILS_ROOT}/public/403.html", :status => 403 if BlackList.include?(ip_sec)end

我们可以定义一个全局的过滤器,对所有请求进行过滤,出现在黑名单的IP地址一律拒绝。对非黑名单的IP地址再进行计数和统计:

ip_counter = Rails.cache.increment(request.remote_ip)if !ip_counterRails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes)elsif ip_counter > 2000crawler_counter = Rails.cache.increment("crawler/#{request.remote_ip}")if !crawler_counterRails.cache.write("crawler/#{request.remote_ip}", 1, :expires_in => 10.minutes)elsif crawler_counter > 50BlackList.add(ip_sec)render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 and return falseendrender :template => 'test', :status => 401 and return falseend

如果某个IP地址单位时间内访问频率超过阀值,再增加一个计数器,跟踪他会不会立刻填写验证码,如果他不填写验证码,在短时间内还是高频率访问,就 把这个IP地址段加入黑名单,除非用户填写验证码激活,否则所有请求全部拒绝。这样我们就可以通过在程序里面维护黑名单的方式来动态的跟踪爬虫的情况,甚 至我们可以自己写个后台来手工管理黑名单列表,了解网站爬虫的情况。

关于这个通用反爬虫的功能,我们开发一个开源的插件:

这个策略已经比较智能了,但是还不够好!我们还可以继续改进:

1、用网站流量统计系统来改进实时反爬虫系统

还记得吗?网站流量统计系统记录的IP地址是真实用户访问IP,所以我们在网站流量统计系统里面也去操作memcached,但是这次不是增加计数 值,而是减少计数值。在网站流量统计系统里面每接收到一个IP请求,就相应的cache.decrement(key)。所以对于真实用户的IP来说,它 的计数值总是加1然后就减1,不可能很高。这样我们就可以大大降低判断爬虫的阀值,可以更加快速准确的识别和拒绝掉爬虫。

2、用时间窗口来改进实时反爬虫系统

爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近 12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时 间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码。

最终这个实时反爬虫系统就相当完善了,它可以很快的识别并且自动封锁爬虫的访问,保护网站的正常访问。不过有些爬虫可能相当狡猾,它也许会通过大量 的爬虫测试来试探出来你的访问阀值,以低于阀值的爬取速度抓取你的网页,因此我们还需要辅助第3种办法,用日志来做后期的分析和识别,就算爬虫爬的再慢, 它累计一天的爬取量也会超过你的阀值被你日志分析程序识别出来。

总之我们综合运用上面的四种反爬虫策略,可以很大程度上缓解爬虫对网站造成的负面影响,保证网站的正常访问。


如何保护DNS服务器?

DNS解析是Internet绝大多数应用的实际定址方式;它的出现完美的解决了企业服务与企业形象结合的问题,企业的DNS名称是Internet上的身份标识,是不可重覆的唯一标识资源,Internet的全球化使得DNS名称成为标识企业的最重要资源。

1.使用DNS转发器

DNS转发器是为其他DNS服务器完成DNS查询的DNS服务器。 使用DNS转发器的主要目的是减轻DNS处理的压力,把查询请求从DNS服务器转给转发器, 从DNS转发器潜在地更大DNS高速缓存中受益。

使用DNS转发器的另一个好处是它阻止了DNS服务器转发来自互联网DNS服务器的查询请求。 如果你的DNS服务器保存了你内部的域DNS资源记录的话, 这一点就非常重要。 不让内部DNS服务器进行递归查询并直接联系DNS服务器,而是让它使用转发器来处理未授权的请求。

2.使用只缓冲DNS服务器

只缓冲DNS服务器是针对为授权域名的。 它被用做递归查询或者使用转发器。 当只缓冲DNS服务器收到一个反馈,它把结果保存在高速缓存中,然后把 结果发送给向它提出DNS查询请求的系统。 随着时间推移,只缓冲DNS服务器可以收集大量的DNS反馈,这能极大地缩短它提供DNS响应的时间。

把只缓冲DNS服务器作为转发器使用,在你的管理控制下,可以提高组织安全性。 内部DNS服务器可以把只缓冲DNS服务器当作自己的转发器,只缓冲 DNS服务器代替你的内部DNS服务器完成递归查询。 使用你自己的只缓冲DNS服务器作为转发器能够提高安全性,因为你不需要依赖你的ISP的DNS服务 器作为转发器,在你不能确认ISP的DNS服务器安全性的情况下,更是如此。

3.使用DNS广告者(DNS advertisers)

DNS广告者是一台负责解析域中查询的DNS服务器。

除DNS区文件宿主的其他DNS服务器之外的DNS广告者设置,是DNS广告者只回答其授权的域名的查询。 这种DNS服务器不会对其他DNS服务器进行递归 查询。 这让用户不能使用你的公共DNS服务器来解析其他域名。 通过减少与运行一个公开DNS解析者相关的风险,包括缓存中毒,增加了安全。

4.使用DNS解析者

DNS解析者是一台可以完成递归查询的DNS服务器,它能够解析为授权的域名。 例如,你可能在内部网络上有一台DNS服务器,授权内部网络域名服务器。 当网络中的客户机使用这台DNS服务器去解析时,这台DNS服务器通过向其他DNS服务器查询来执行递归 以获得答案。

DNS服务器和DNS解析者之间的区别是DNS解析者是仅仅针对解析互联网主机名。 DNS解析者可以是未授权DNS域名的只缓存DNS服务器。 你可以让DNS 解析者仅对内部用户使用,你也可以让它仅为外部用户服务,这样你就不用在没有办法控制的外部设立DNS服务器了,从而提高了安全性。 当然,你也 可以让DNS解析者同时被内、外部用户使用。

5.保护DNS不受缓存污染

DNS缓存污染已经成了日益普遍的问题。 绝大部分DNS服务器都能够将DNS查询结果在答复给发出请求的主机之前,就保存在高速缓存中。 DNS高速缓存 能够极大地提高你组织内部的DNS查询性能。 问题是如果你的DNS服务器的高速缓存中被大量假的DNS信息“污染”了的话,用户就有可能被送到恶意站点 而不是他们原先想要访问的网站。

绝大部分DNS服务器都能够通过配置阻止缓存污染。 WindowsServer 2003 DNS服务器默认的配置状态就能够防止缓存污染。 如果你使用的是Windows 2000 DNS服务器,你可以配置它,打开DNS服务器的Properties对话框,然后点击“高级”表。 选择“防止缓存污染”选项,然后重新启动DNS服务器。

6.使DDNS只用安全连接

很多DNS服务器接受动态更新。 动态更新特性使这些DNS服务器能记录使用DHCP的主机的主机名和IP地址。 DDNS能够极大地减

轻DNS管理员的管理费用 ,否则管理员必须手工配置这些主机的DNS资源记录。

然而,如果未检测的DDNS更新,可能会带来很严重的安全问题。 一个恶意用户可以配置主机成为台文件服务器、Web服务器或者数据库服务器动态更新 的DNS主机记录,如果有人想连接到这些服务器就一定会被转移到其他的机器上。

你可以减少恶意DNS升级的风险,通过要求安全连接到DNS服务器执行动态升级。 这很容易做到,你只要配置你的DNS服务器使用活动目录综合区 (Active Directory Integrated Zones)并要求安全动态升级就可以实现。 这样一来,所有的域成员都能够安全地、动态更新他们的DNS信息。

7.禁用区域传输

区域传输发生在主DNS服务器和从DNS服务器之间。 主DNS服务器授权特定域名,并且带有可改写的DNS区域文件,在需要的时候可以对该文件进行更新 。 从DNS服务器从主力DNS服务器接收这些区域文件的只读拷贝。 从DNS服务器被用于提高来自内部或者互联网DNS查询响应性能。

然而,区域传输并不仅仅针对从DNS服务器。 任何一个能够发出DNS查询请求的人都可能引起DNS服务器配置改变,允许区域传输倾倒自己的区域数据 库文件。 恶意用户可以使用这些信息来侦察你组织内部的命名计划,并攻击关键服务架构。 你可以配置你的DNS服务器,禁止区域传输请求,或者仅允 许针对组织内特定服务器进行区域传输,以此来进行安全防范。

8.使用防火墙来控制DNS访问

防火墙可以用来控制谁可以连接到你的DNS服务器上。 对于那些仅仅响应内部用户查询请求的DNS服务器,应该设置防火墙的配置,阻止外部主机连接 这些DNS服务器。 对于用做只缓存转发器的DNS服务器,应该设置防火墙的配置,仅仅允许那些使用只缓存转发器的DNS服务器发来的查询请求。 防火墙策略设置的重要一点是阻止内部用户使用DNS协议连接外部DNS服务器。

9.在DNS注册表中建立访问控制

在基于Windows的DNS服务器中,你应该在DNS服务器相关的注册表中设置访问控制,这样只有那些需要访问的帐户才能够阅读或修改这些注册表设置。

HKLM\CurrentControlSet\Services\DNS键应该仅仅允许管理员和系统帐户访问,这些帐户应该拥有完全控制权限。

10.在DNS文件系统入口设置访问控制

在基于Windows的DNS服务器中,你应该在DNS服务器相关的文件系统入口设置访问控制,这样只有需要访问的帐户才能够阅读或修改这些文件。

蠕虫和普通病毒的区别 以及对蠕虫病毒的防范措施

可以安装一些杀毒软件在电脑上如电脑管家一类的,然后一直保持开启这样就可以预防病毒进入到电脑当中了

网站如何防御避免80端口上千万的CC攻击

首先在网络上搜索【360网站卫士】,进入360网站卫士官方网站。 进入360网站卫士官方网后,如果你已经有360的账户,那么就在这里填写账户信息,并且登录账户。 如果没有账户就先注册账户再登录。 登录后会自动为我们跳转到添加网站页面,我们在网址输入框填入网站网址,注意不要带WWW的。 比如:【 】即可。 点击【添加网站】!这里我们选择一种接入方式,我们选择他们推荐的这种【NS方式】,这种接入方式可以让我们的网站额外得到DNS的防护功能,选择好后点击【下一步】。 这里配置网站记录 ,请认真检查一下配置是否与你域名解析处相同,或者域名解析处有没有下面的解析,如果发现不对就去添加或者修改即可。 然后【下一步】!最后修改NS地址,复制上面提供的两个NS地址,拿到域名管理的【修改DNS】处,然后依次填写两个NS地址就可以了。 最后点击【完成】。 到了这里我们已经宣告即将成功了,点击上面的【自助审核】,并马上审核成功了。 我们点击防护设置,就能对防护进行相应的设置,以后就不用怕被CC攻击了。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐