爬虫与反爬虫的战争

百家 作者:焦点安全应急响应中心 2020-10-23 20:36:17

前言

    “FSRC经验分享”系列文章,旨在分享焦点科技信息安全部工作过程中的经验总结,包括漏洞分析、运营技巧、SDL推行、等保合规、自研工具等等。
    欢迎各位安全从业者持续关注~ 

1
认识爬虫
    
网络爬虫,是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。从技术上说,爬虫只是一种批量获取具有一定结构的信息的方法,是技术人对于提升效率进行思考的产物。
但一些恶意访问者(获取数据目的不轨),大量拖取业务数据,以用于盗版网站的搭建等非法目的,侵害了网站的知识产权。
此外,还有一些爬虫er叫做爬虫小白(单纯的初玩爬虫),练习爬取数据,却不知道限制访问频率,这种请求方式会加重服务器负担。如果这样的“低端玩家”过多,甚至会令网站进入拒绝服务状态。

2
反爬虫的诞生

当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护。此外无论是侵犯知识产权,还是加重服务器负担,都对于知识创造者和原始分享者产生了一定的影响。因此反爬虫应运而生。
很多网站开始反网络爬虫,想方设法保护自己的内容。他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片,css混淆等五花八门的技术,来进行反爬虫工作。

3
常见的反爬虫方案

限制UA

   
建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。

IP限制

   

如果一个固定的ip在短暂的时间内,快速大量的访问一个网站,后台管理员可以编写IP限制,不让该IP继续访问。


SESSION访问限制

   

后台统计登录用户的操作,比如短时间的点击事件,请求数据事件,与正常值比对,用于区分用户是否处于异常状态,如果是,则限制登录用户操作权限。


蜘蛛陷阱

   

创建无限深度的目录结构、动态页面,为网络爬虫生成无限数量的文档(如由算法生成杂乱的文章页面,文档中填充了大量字符),使解析文档的词法分析器崩溃。


验证码

   

字符、滑动、短信、图画识别、计算题、倒立文字……

详见FSRC前一篇文章:【验证码的那些事儿】


robots.txt

   

建立文件robots.txt在主目录下,声明哪些页面可以爬取,哪些不可以。


使用加密算法数据加密

   

前端——通过对查询参数、user-agent、验证码、cookie等前端数据进行加密生成一串加密指令,将加密指令作为参数,再进行服务器数据请求。

服务器端——在服务器端同样有一段加密逻辑,生成一串编码,与请求的编码进行匹配。

如果前端返回的该加密参数为空或者匹配错误,服务器都不对请求进行响应。

数据动态加载

   

python的requests库只能爬取静态页面,爬取不了动态加载的页面。使用JS加载数据方式,能提高爬虫门槛。


使用字体文件映射

   

服务器端根据字体映射文件先将客户端查询的数据进行变换再传回前端,前端根据字体文件进行逆向解密。映射方式可以是数字乱序显示,这样爬虫可以爬取数据,但是数据是错误的。


4
常见的应对反爬方法

动态UA库

   
整理一个大的UA list,每次随机挑出一个符合标准的使用。 

分享一个github上关于fake ua的项目:
https://github.com/hellysmile/fake-useragent
IP代理池

   
IP代理池,可通过购买来进行使用,或购买集群云服务来自建代理池。一般根据爬虫数据的价值来选择。

建立帐号库

   

注册多个账号,先整理其session、cookie等,建立帐号库。

后续可以模拟正常操作,或随机取对应值带入脚本进行爬取,避免触发单个用户访问阈值。最好保证一个session在一个代理上。


设置访问延时

   
在对实时性没有那么强的需求时,可以设置访问延时或随机等待时间,避免触发网站的反爬虫机制。

绕过robots

   

如果使用scrapy框架,可以将settings文件里的 ROBOTSTXT_OBEY  设置值为 False


注意:

爬取已声明robots的页面,可能存在法律风险


行为建议
爬取网页-访问量小可以遵守
爬取网页-访问量大建议遵守
爬取网站-非商业且偶尔建议遵守
爬取网站-商业用途
必须遵守
爬取全网必须遵守

CSS聚类

   

主要针对蜘蛛陷阱,把网页按照所引用的css文件进行聚类,通过控制类里最大能包含的网页数量防止爬虫进入trap后出不来,对不含css的网页会给一个penalty,限制其能产生的链接数量。

这个办法理论上不保证能避免爬虫陷入死循环,但是实际上这个方案工作得挺好,因为绝大多数网页都使用了css,动态网页更是如此。

js2py

   

js2py模块可以对js文件进行解密,针对数据是js加密生成的情况,使用js2py在python中运行JS代码,从而得到相应的编码。


UI自动化工具

   

对js加密的情况,还可以借助UI自动化工具(webdriver、Puppeteer)去执行js调用它的加密方法,需要研究js的花的时间比js2py少的多。工具可能需要付费。

此外还有些网站前几次返回正常页面,超过一定次数之后请求返回的html中只有一个script标签和js,必需执行js才可以继续获取内容,也可以使用js2py或者工具。


绕过反爬工具

   

对目前一些网站针对UI自动化工具做防爬虫处理,比如判断navigator中的webdriver属性。可参考网上一些绕过方法,比如pyppeteer中:

await page.evaluateOnNewDocument(r'''          () = > {            const newProto = navigator.__proto__;            delete newProto.webdriver;            navigator.__proto__ = newProto;        }        ''')

接码平台

   

针对验证码,接入第三方验证码平台,实时破解网站的验证码。


5
爬虫和反爬的竞争不会停止

反爬虫不惜工本,目标是迫使爬虫在考虑成本效益后放弃;

爬虫不惜工本,目标是反爬虫在考虑用户流失后放弃。

客观上,爬虫与反爬虫在攻防之间,促进了彼此技术发展,并且随着数据的重要性越来越高,双方的发展还会越来越快。

爬虫人员也可以不仅仅局限于爬取数据,试着往大数据方向发展,数分、数挖、机器学习等方面发展,前途也是不可限量的!

6
免责声明

本文中提到的相关资源已在网络公布,仅供研究学习使用,请遵守《网络安全法》等相关法律法规。

7
参考资料

从全景视角看爬虫与反爬虫(by 腾讯安全)
https://blog.csdn.net/qcloud_security/article/details/81137437
一入爬虫深似海,反爬技术你知多少?(by Alex 007)
https://blog.csdn.net/weixin_43336281/article/details/105698852
爬虫、反爬虫、反反爬虫(by 星空str)
https://www.cnblogs.com/wangxin37/p/6398745.html

FSRC愿与你共同成长


关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接