1.爬虫与反爬虫的概念互联网站点的部分流量是由人的正常访问行为产生的,而高达30%-60%的流量是由网络爬虫产生的,其中一部分包括友好网络爬虫,例如搜索引擎爬虫、广告程序、第三方合作伙伴程序、机器人协议友好程序等;并不是所有的网络爬虫都是友好的,大约20%到30%的爬虫流量仍然来自恶意网络爬虫。从网站业务安全的角度来看,例如文学博客、招聘网站、论坛网站、电子商务等网站都以文本为商品作为盈利点,而恶意爬虫则可以通过爬取核心文本谋取利益;利用恶意爬虫爬取商品价格及详情或注册用户信息,对同类产品线及价格进行研究,以低价等方式扰乱市场秩序;对于带宽有限的中小型网站,高频、大规模的恶意爬虫可能会降低网页的加载速度,影响真实用户的访问体验,增加网站的带宽负担。由于恶意爬虫带来的不良影响,爬虫防御技术应运而生——即反爬虫技术。反爬虫技术可以分为被动防御机制和主动防御机制。?被动防御机制:主要是根据检测结果,比如利用HTTP请求头User-Agent进行判断,拦截爬虫请求,或者屏蔽访问频率高的IP地址。被动防御存在一些不足:被动防御的检测流程和机制单一,无法应对复杂多变的恶意爬虫,检测误报率高,容易造成虚封、漏封。?主动防御机制:是爬虫防御的主流发展方向。通过对网页底层代码的不断动态改造,增加了服务器行为的“不可预测性”,大大提高了攻击难度,实现了从客户端到服务端的全方位“恢复”。ActiveProtection”。2.网络爬虫技术的基本工作流程和基础架构与正常人类访问者通过浏览器访问网页的工作原理相同。网络爬虫也是根据HTTP协议获取网页信息。其过程主要包括具体步骤如下:1)对待爬取URL进行域名解析;2)根据HTTP协议,发送HTTP请求获取网页内容网络爬虫的基本架构如图1所示。具体来说,网络爬虫首先通过扩展种子URL获取待抓取URL队列,然后逐一读取待抓取URL列表。在读取url的过程中,会对url进行DNS解析,得到IP地址和相对路径,然后将这个地址交给网页下载器(负责下载网页内容的模块),对于下载的本地网页,即网页的源代码,一方面这个网页要存放在网页库中,另一方面需要从下载的网页中重新提取URL地址。新提取的URL地址会与已经抓取到的URL列表进行比较,判断网页是否已经被抓取。如果网页还没有被抓取,一旦抓取,将新的URL地址放在待抓取的URL列表的末尾,等待抓取完成。当待抓取队列为空时,网络爬虫已经完成了整个抓取过程,最后对网页抓取库中下载的网页进行分析索引,得到索引结果。所谓种子URL就是一开始选择的URL地址,网站首页、频道页等内容丰富的页面常被用作种子URL。图1网络爬虫基础架构3.基于自定义cookies的爬虫检测策略目前的爬虫检测技术主要分为以下四类:一类是基于日志分析的检测技术,一类是基于访问模式的检测技术,以及三是基于访问行为的检测技术,四是基于图灵测试的检测技术。基于日志分析的检测技术是通过将爬虫列表库中爬虫的User-Agent关键字、IP地址等信息与用户的进行比对来检测爬虫。基于访问模式的检测技术通过寻找人类用户和爬虫的不同流量特征来检测爬虫,例如查询次数、时间间隔模式、搜索操作频率等。大多数基于访问行为的检测技术使用机器学习模型例如神经网络、决策树等,通过访问者的点击时间、图片加载情况、访问时长等有利特征对访问进行分类,从而判断访问是否来自爬虫。基于图灵测试的检测技术通过让访问者回答一些问题来分析是否为爬虫。常见的图灵测试系统有验证码测试。除了以上四类方法外,蜜罐技术(隐藏链接)也常被用来识别爬虫,通过在网页中隐藏一些人眼无法发现但爬虫可以访问的链接。基于自定义cookies的检测技术是一种基于日志分析主动防御爬虫的策略。该策略是通过在网站的界面中添加一些加密参数来实现的。浏览器执行返回的JS代码,获取时间敏感且保密的结果,并将结果添加到cookie中,再次发起请求时携带。正常人类访问者和恶意爬虫的访问过程如图2所示。图2正常人类访问者和恶意爬虫访问流程图具体来说,将JS代码返回给客户端,通过客户端执行JS代码的结果,主动防御爬虫。cookie生成过程可以结合客户端浏览器的特性。这种特征检测只能在真实的浏览器和真实的用户访问行为的情况下完成,而不能在某些浏览器内核模拟器或某些伪造的请求头User-Agent获取的情况下完成。例如服务器端返回的检测脚本,用于检测浏览器是否存在bug。对于实际的浏览器,浏览器本身存在bug,但是爬虫程序中的假浏览器运行检测脚本生成相应的cookie时,并不会获取到正确的cookie,因此可以断定是访问用户是一个爬虫。又如,浏览器是否具有网页翻译功能,包含在cookie生成脚本中。就实际浏览器而言,浏览器本身具有网页翻译功能,但当客户端浏览器运行检测脚本时,会进行网页翻译。函数失效,所以也可以断定访问用户是爬虫。基于自定义cookies的爬虫检测技术,浏览器可以通过执行JS代码得到后台识别的结果。同样,攻击者也可以拦截JS代码并进行分析,达到同样的目的。所以返回的JS代码需要具备抗拦截、不易逆向的特性。此时JavaScript-obfuscator混淆技术与自定义的cookie-based检测技术相结合,保证代码安全。这里的JavaScript-obfuscator混淆技术通常包括JS代码压缩、混淆和加密技术。4、JS代码压缩、混淆和加密JS代码压缩是去掉JS代码中不需要的空格、换行符等内容,使源代码压缩成几行,降低代码可读性,同时也可以提高加载速度网站。JS代码混淆是一种理想实用的代码保护方案。通过使用变量混淆、字符串混淆、去格式化、控制流扁平化、无用代码注入、对象键名替换、禁用控制台输出、调试保护、域名锁定等手段,在不影响代码原有功能的基础上,使代码难以阅读和分析,达到保护的最终目的。JS代码加密就是通过某种方式对JS代码进行加密,变成人类无法读取和解析的代码,或者将代码完全抽象加密。常见的JS代码加密技术有JSfuck、AAEncode、JJEncode、eval加密等。JSfuck、AAEncode、JJEncode加密技术使用各自的符号库对JS代码进行编码,eval加密常用eval(p,a,c,k,e,r)或eval(function(p,a,c,k,e,d)作为代码的开头,以上四种加密方式具有明显的加密特性,易于解码,使用浏览器的开发者工具可以完全还原,同时重度堆叠eval加密技术,可能会出现内存溢出,所以只适合核心功能加密,特别是JJEncode有浏览器依赖,代码无法在特定浏览器上运行,另外还有更强大的加密技术,可以直接实现JSC/C++中的代码,浏览器调用编译后的文件执行相应的功能,如Emscripten、WebAssembly变量混淆就是把有意义的变量名、方法名、常量名随机改成无意义的乱码字符串,降低代码可读性,例如转换成单个字符或十六进制字符串。字符串混淆是将字符串放在一个数组中,并进行MD5或Base64加密存储,这样代码中就不会出现明文字符串,可以避免使用全局搜索字符串的方法来定位入口点。JS代码格式化的原因是本地保存的JS文件是压缩的,不利于观察。格式化就是美化,反格式化就是JS代码如果格式化了就不能执行了,导致浏览器冻结。控制流扁平化打乱了函数原有的代码执行流程和函数调用关系,将驱动逻辑块统一加在逻辑处理块之前,使得代码逻辑混乱无序。打断代码块之间的关系,由一个分发器控制代码块的跳转,如图3和图4所示。图3混淆前的代码流程图图4混淆后的代码流程图不会在代码中执行,进一步让代码看起来更加混乱。通过清空控制台方法(console.log、console.debug、console.info、console.error、console.exception、console.trace、console.warn)来禁用控制台输出。调试保护是根据调试器的特性,检查当前的运行环境,增加一些强制性的调试器语句,使得JS代码在调试模式下难以顺利执行。域锁是让JS代码只能在指定的域名。5、JavaScript-obfuscator混淆在前端开发中,作为JS混淆的主流实现,JavaScript-obfuscator库和terser库提供了一些代码混淆功能,同时也有对应的Webpack和Rollup打包工具插件,以便于方便实现页面混淆,最后输出压缩混淆后的JS代码,大大降低了JS代码的可读性。JavaScript-obfuscator混淆选项如图5所示。图5ObfuscationoptionsforJavaScript-obfuscatorobfuscationJavaScript-obfuscator混淆参数较多,但JavaScript-obfuscator混淆代码的抽象语法树依次包含以下结构:大数组-->数组移位-->解密函数-->控制流扁平化后的核心代码-->无限调试器自执行函数+死代码注入。整体OB的强度几乎完全取决于这四个段的代码强度,其中包含预加密逻辑。常见的混淆工具包括YUICompressor、GoogleClosureCompiler、UglifyJS、JScrambler和JavaScript混淆工具(obfuscator.io、soJSONv5.0v6.0、JShaman)。6.小结爬虫贡献了互联网50%的流量,互联网的繁荣离不开它们。不过,这项技术也因为它的“用途”而饱受争议。爬虫和反爬虫一直处于相互博弈的状态。在这个过程中,反爬虫逐渐发展成为具有智能交互、数据采集、实时计算、模型分析和决策判断等能力的综合安全体系,而不再是一个简单的工具。相信随着监管越来越严格,爬虫技术的使用边界会越来越清晰,互联网环境也会越来越清晰。
