你可能不知道的反爬虫知识

在这个人均python时代,产品运营同学也能分分钟写出一个爬虫来产出数据报表,我这段时间也是想要写一个爬虫来刷一刷我发的帖子的点击率,从而开始调查起了爬虫,又调查起了反爬,又看起了反反爬……现在已经被精神招安了!今天就和大家一起讨论一下螺旋上升,永无止尽的反爬道路。

首先,我们能用爬虫做到哪些事情呢?根据调查大头一定是抢火车票(12306是全国最难爬的网站),还有像是预定场地、操纵僵尸粉、比价、刷点击率、分析用户数据达到个人目的等。

其实一般的公司可能根本没有采用反爬措施,还有一些网站可能只对数字做了字体映射,并不会更换字体文件或算法,但我们这篇文章的前提是保护有价值的数据,所以要尽可能的增加黑客们爬数据的成本,另一方面也是降低服务器的压力。

我们把爬数据分为最主要的两种途径,爬接口和爬页面(SSR)

爬接口的话一般采用网络封包截取工具来拦截请求,代码模仿请求来进行大批量的数据获取。而爬页面则会使用Selenium或者puppeteer来模仿人类行为获得网页,从中摘取特定的信息。对于爬页面目前还会有元素匹配OCR识别两种主流的内容匹配方式。元素匹配是根据HTML或者页面上的元素信息通过元素选择器,如正则、xpath等进行选择并匹配;而OCR识别则是将网页当做图片进行文本识别,并根据文本的展示特征,如颜色、尺寸、位置等进行匹配。

这两种途径会有一些共通的防范措施:

  • 首先最基础的是校验user-agent、referer等请求头。虽然绝大部分成熟的爬虫会对这些header进行处理,但是这也是必须要去做的,同时也帮助我们的网站实现防盗链等其他安全目标。

  • 是用户信息相关

    • 如果我们的页面是无登录态就可以查询有价值的数据
      • 可以采用canvas指纹追踪(可以多混入一些信息以免误伤)
      • 也可以采用ip来追踪(可以防一些没有ip池的黑客)
    • 如果我们的页面是只有登录态才可以查询有价值的数据
      • 使用cookie、token来追踪
      • 登录时接入滑块、验证码、识字(识图)
        • 三者各有可以破解的方法,比如人为模拟拖拽、ocr、打码平台等等,相对来说比较安全的是识图,但是可能会增加用户崩溃的可能(不知道你们有没有在*时为了证明自己不是机器人而一张张识别公交车的经历)
  • 在某个cookie/canvas指纹/ip发出大量不合理的请求次数后采用封禁

  • 无论是接口反爬还是SSR反爬,都需要对数字和一些常用字进行映射加密,增加破解成本,主要的方式有:

    • 函数计算映射,服务端进行加密,前端进行解密(用于接口反爬)
    • unicode映射,可以利用偏移值,现在大部分接入反爬的网站会生成字体文件来进行字符映射,像这样的网站就需要我们手工或者OCR写映射map了(接口反爬+SSR都适用)
    • 不管是函数计算还是unicode,都需要定期更换算法,提升破解成本,也可以两种方式进行互换
      • 有一种做法是:将字体左右分割开,一个字用两个unicode表示,前端使用单个字符间距控制可以再拼回一个字,以现在的OCR技术是无法识别的,但是相应代价也会变大。
      • unicode映射的一个缺点是不能灵活的改字体样式
  • 如果是表单类

    • 可以更多的去校验一些人类不会做到的异常行为,比如特别快速的填写表单等
    • 而表单也是一个很适合使用蜜罐圈套的case
      • 攻击者可能会使用Selenium或者puppeteer等手段填写表单,可以混合一些需要提交和不需要的提交的隐藏字段来增加攻击者犯错难度,一旦黑客们提交了不含隐藏字段的表单信息,则可以标记为攻击者。
  • 如果已经有标记为攻击者的网站请求数据,可以进行投毒处理,故意返回错误的数据误导攻击者。

接下来是一些详例:

接口反爬

让我们先看一个反爬的例子~

拦截了一个生活网站数据的请求,可以看到header中有一个x-sign
你可能不知道的反爬虫知识
如果我们手动改变了参数,会提示不接受请求,因为服务端计算的sign值和前端提交的不同。
这种方式叫做验签,如果前端使用了验签进行参数加密,那黑客需要去代码中查看混淆后的加密逻辑,如果定期更换加密方式,也可以增加黑客的心智成本。

除了接口验签以外,加密也是一个非常常用的反爬手段,下面是一个知名旅行预订网站的例子:
你可能不知道的反爬虫知识
对应的接口返回如下:
你可能不知道的反爬虫知识
可以看到,接口中价格数据与实际在屏幕上看到的数据并不相同,这里就是接口上对数据进行了加密,并且每次接口请求采用的加密算法都会有所调整,通过t1000字段将解码的所需的信息提供给前端展示时使用。同时,界面在展示的时候还进行了混淆,通过定位的方式将真实的价格中每个数字调整了位置和顺序。然而,标签中的title信息反而成了反爬中的漏洞,将价格直接标注了出来,这也是我们在反爬的实践中需要注意的点——任何漏洞都会成为黑客利用的目标。
你可能不知道的反爬虫知识

SSR反爬

老样子,先看一个

上一篇:Unicode和之间utf8的关系


下一篇:使用 FutureProvider 简化个人主页异步请求的状态管理