反爬虫

接口定制化反爬

对于目的明确的爬虫,只访问特定的接口,这种特征意味着反爬方可以通过镇对特定IP进行接口限流来防御

但爬方可以通过访问其他接口来伪装,同时可以上代理服务器突破单个IP阈值

最后,由于NAT的存在,这种方式可能会误杀正常用户

数据投毒

明确对方爬数据的意图,返回造成其无法达成目的、利于自身的假数据

随机来回

对于数据下毒混淆,对于识别出爬虫的客户端使用随机的策略来避免爬虫方通过数据的整体统计出正确值

爬虫方此时若想跳出与反爬方一来一回的结局识别出假数据,只能通过更深的伪装,将伪装成真正的用户请求的数据与假数据比对来发现出假数据

但一来一回,随着反爬措施升级,势必会误伤真实用户

字体反爬

这种方式对于网络有较高要求,在弱网环境下不仅会误伤真实用户,反爬效率也不高,当误杀真实用户时,甚至有陷入舆论风波的危险

浏览器模拟反爬

当爬虫直接使用模拟浏览器爬数据,通过canvas指纹、dom指纹,本质都是识别请求特征,对于这种特征的请求统统封杀

更疯狂的可以故意拖慢浏览器性能,降低爬虫爬的量,只是苦了用户

验证码反爬

简单的字符验证码防不住OCR,复杂的验证码可以接入打码平台,而且愈复杂的验证码愈影响用户体验

网络攻防反爬

有些使用前端加密的反爬都有一段核心加密代码,这段代码在浏览器可以直接获取到,如果爬虫想模拟请求,可能会尝试执行摘下来这段代码在本地去执行从而去模拟加密发起请求,如果这段代码包含恶意分支,那么可以直接对爬虫的本地环境发起攻击,无论是格盘、还是什么恐怖的操作

进行到这一步,就是从反爬转守为攻,可以是社工、可以是悄悄潜伏

爬虫行为

协议

抓取

解析验证

反爬方可以返回不标准的标签但浏览器可以识别的标签来干扰爬虫的解析

此时直接使用浏览器的DOM解析虽然可以规避,但是效率很低

而为了验证是不是假数据,通过机器进行交叉验证,也就说对比其多个端的接口看是否一致,也可以进行人工抽检,当发现假数据,应将本批数据全部作废

爬虫检测

网络层检测

这一层一般就是对检测出属于爬虫的IP或者IP段进行封锁

需要配合白名单机制防止误伤

通过WHOIS识别出对方是不是公有云,或者进行端口扫描其有没有开放的端口,总之不属于正常用户的特征统统封杀

应用层检测

学习并聚合非爬虫的HTTP请求特征,爬虫很难一直模仿正常的浏览器

像是请求头

浏览器特征检测

以DOM指纹为代表的技术就是通过发现爬虫渲染的DOM特征与正常用户的DOM特征不一样来检测

具体的操作过程,其实就是从 Window 开始往下拉一棵树,循环引用跳掉,最终得到的 DOM 结构

业务特征检测

爬虫跟正常用户总是拥有不一样的行为,利用业务流程的特性,发现爬虫

分布式爬虫

分布式不仅可以使用更多的IP资源进行伪装 同时进行异构分布式也能使爬虫很好伪装自己 提升可用性

爬虫的法律问题

爬虫到道德问题

后端反爬

特征检测模块

key生成

某些操作总是需要前端向后端传递一个特殊看似随机的key的 为了防爬虫 这个key要如何生成?

一个很重要的点就是需要引入随机跟混淆 随机又不能真随机 否则后端无法校验

这点跟一些接口使用签名的方式是一样的

var left = md5(sku+current_hour+fingerprint(http-header))// 32位
var right = md5(random())// 取一个随机值,并md5掉,用于混淆key
var result = xor(left, right)+right// 两个key异或作为新key的left,right不变。

为了更加变态的反爬,可以通过后端下发预定义的n个加密策略,随机组合来进行加密

但是这些加密策略最终也是要在前端变成js代码执行的,如果保护代码:

随机

对于后端反爬,不做百分百封杀 而是通过返回小部分假数据的方式 只要存在一定假数据 对方爬取的这批数据就无法真正地敢用在生产环境

效果检测

快速下线

在设计爬虫检测拦截时,降低反爬虫系统的入侵性,减少与业务代码的耦合,是反爬虫代码的重中之重

stateDiagram-v2
  客户端 --> SLB
  SLB --> 应用层
  SLB --> 规则引擎
  规则引擎 --> 应用层
  应用层 --> 反爬SDK
  反爬SDK --> 规则引擎
  反爬SDK --> 业务层

前端反爬

信息收集

为了收集足够多的信息来对抗爬虫,需要注意的有: