爬虫写得好牢饭吃到饱,大厂是如何做反爬虫的

爬虫写得好牢饭吃到饱,大厂是如何做反爬虫的已关闭评论

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

爬虫能做什么

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

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

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

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

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

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

  2. 是用户信息相关

  • 如果我们的页面是无登录态就可以查询有价值的数据
    • 可以采用canvas指纹追踪(可以多混入一些信息以免误伤)
    • 也可以采用ip来追踪(可以防一些没有ip池的黑客)
  • 如果我们的页面是只有登录态才可以查询有价值的数据
    • 三者各有可以破解的方法,比如人为模拟拖拽、ocr、打码平台等等,相对来说比较安全的是识图,但是可能会增加用户崩溃的可能(不知道你们有没有在科学上网时为了证明自己不是机器人而一张张识别公交车的经历)
    • 使用cookie、token来追踪
    • 登录时接入滑块、验证码、识字(识图)
  • 在某个cookie/canvas指纹/ip发出大量不合理的请求次数后采用封禁
  1. 无论是接口反爬还是SSR反爬,都需要对数字和一些常用字进行映射加密,增加破解成本,主要的方式有:
  • 函数计算映射,服务端进行加密,前端进行解密(用于接口反爬)
  • unicode映射,可以利用偏移值,现在大部分接入反爬的网站会生成字体文件来进行字符映射,像这样的网站就需要我们手工或者OCR写映射map了(接口反爬+SSR都适用)
  • 不管是函数计算还是unicode,都需要定期更换算法,提升破解成本,也可以两种方式进行互换
    • 有一种做法是:将字体左右分割开,一个字用两个unicode表示,前端使用单个字符间距控制可以再拼回一个字,以现在的OCR技术是无法识别的,但是相应代价也会变大。
    • unicode映射的一个缺点是不能灵活的改字体样式
  1. 如果是表单类
  • 可以更多的去校验一些人类不会做到的异常行为,比如特别快速的填写表单等
  • 而表单也是一个很适合使用蜜罐圈套的case
    • 攻击者可能会使用Selenium或者puppeteer等手段填写表单,可以混合一些需要提交和不需要的提交的隐藏字段来增加攻击者犯错难度,一旦黑客们提交了不含隐藏字段的表单信息,则可以标记为攻击者。
  1. 如果已经有标记为攻击者的网站请求数据,可以进行投毒处理,故意返回错误的数据误导攻击者。

接下来是一些详例:

接口反爬

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

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

除了接口验签以外,加密也是一个非常常用的反爬手段,下面是一个知名旅行预订网站的例子:

image.png

对应的接口返回如下:

image.png

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

image.png

SSR反爬

老样子,先看一个🌰

某知名美食网站 可以看到该网站没有发起请求店家的接口,这一块应该是直接SSR的,去看下页面

可以看到有几个小方块,对应的字是“五道口”,然后可以看到class名是tagName 接着我们去该网站的css中寻找这个className 找到了,同时去把字体文件5d7135e1下下来,然后我们可以挑第一个方块转成unicode看一下,这个字画面上展示的是“五”,对应的unicod为ue509 www.ifreesite.com/unicode-asc…[1]

在线看一下字体文件 blog.luckly-mjw.cn/tool-show/i…[2]

image.png

ue509对应的就是五,可以看到它也是采用了unicode映射的方式来进行数据反爬。

在调查这个网站的同时,还看了猫眼的反爬做法,也是使用了unicode映射,但是猫眼每刷新一次就会生成一个新的字体文件,黑客就必须每次访问分析新的映射逻辑,于此相对的成本会有些高。然而,由于它字体文件中包含的文字数量很少,这就给黑客留下了一个可乘之机,黑客可以通过OCR或者人工识别的方法先分析出字体文件中每个文字对应的svg数据,然后在获得新的字体文件后直接根据svg的数据进行字符匹配,从而能够省去后续请求中再次对字体进行OCR的步骤。

总结

世界上没有完全不可以被爬的网站,既然你的信息展示在黑客面前,极端一些黑客一次次翻页用肉眼把数据都记录下来也是一种爬数据的方式。所以我们的目的是减少被爬,提高黑客去爬的成本,从而减少被爬的次数,最后锁定的极端黑客要保留他们的信息,在危害到我们的利益时可以call police来解决他们,俗话说解决不了问题就解决人嘛。

参考资料

[1]

https://www.ifreesite.com/unicode-ascii-ansi.htm: https://link.juejin.cn?target=https%3A%2F%2Fwww.ifreesite.com%2Funicode-ascii-ansi.htm

[2]

http://blog.luckly-mjw.cn/tool-show/iconfont-preview/index.html: https://link.juejin.cn?target=http%3A%2F%2Fblog.luckly-mjw.cn%2Ftool-show%2Ficonfont-preview%2Findex.html

最后



如果你觉得这篇内容对你挺有启发,我想邀请你帮我个小忙:

  1. 点个「喜欢」或「在看」,让更多的人也能看到这篇内容

  2. 我组建了个氛围非常好的前端群,里面有很多前端小伙伴,欢迎加我微信「sherlocked_93」拉你加群,一起交流和学习

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。



点个喜欢支持我吧,在看就更好了


来源: 前端下午茶