为什么需要数据防护?
当今如今大数据时代,数据重要不言而喻,网页和 App 作为主流的数据载体,如果其数据没有任何的保护措施,在爬虫工程师解决了一些基本的反爬如User-Agent、cookies、验证码等的防护措施之后,那么数据依旧可被轻易的获取。
数据防护主要体现在何处?
数据防护可简略的划分为请求防护、数据内容防护、验证码
请求防护
- User-Agent
- Cookie
- 签名验证
- 握手验证
- 协议
- 。。。
数据内容防护
- CSS字体偏移
- SVG字体映射
- 图片数据
- 。。。
验证码
个人总结为以下几种类型,具体体现不在过多赘述。(注,几者之间无明显的分割标准,在此以侧重点划分)
- 识别点选或输入型
- 滑轨、滑块型
- 短信或语音验证型
思
实现这一切的一切,这些究竟是基于什么实现的?这一切绝可能是凭空出现!!!
其实无论是ajax,User-Agent、还是Cookie等等大部分都是基于Javascript实现。而且由于JavaScript在客户端中为完全透明,用户可以随意的查看与调试,这无异于代码裸奔。虽然以上的反爬虫虽然不错,但如果仔细分析的,这难度也仅是“工作量”的问题。
Javascript防护分类
完全透明的JS代码,虽然可以有效的防止。但这还不够,其根本原因还是JavaScript为明文。而这一切的一切都是“治标不治本”,虽然可以但还不够。也正因为对JavaScript的各种防护,所以才让这些加密“动”起来,无法轻易的分析。对JavaScript“加密”可分为如下几种大类
代码压缩
JavaScript 压缩是指去除 JavaScript 代码中的不必要的空格、换行等内容,或者将一些可能公用的代码进行处理实现共享,最后输出的结果都被压缩为几行内容,代码可读性变差,提高分析难度同时也能提高网站加载速度。
整体来说,压缩技术只能在很小的程度上起到防护作用,要想真正提高防护效果还得依靠混淆与加密技术。
代码混淆
代码混淆是增加分析难度而牺牲部分性能的一种方案,此方案大部分是体现在通过逻辑转换换等方式将代码转化为难以分析的代码。难以分析是混淆的目的,等价转换是需要确保混淆前后的代码需不影响运行的功能。对于混淆可以又分为如下四种:布局混淆、数据混淆、控制混淆、预防混淆
布局混淆
布局混淆指在源代码中删除原有无用代码,处理常量名、变量名函数名等标识符,增加对于代码的阅读与分析。
无用代码:注释、调试信息、缩进、换行、无用函数与数据等
处理常量名、变量名函数名等标识符:
- 标识重命名:将原有代码重命名为无具体意义的字符,例如 将name 重命名为a
注意点:
- 作用域内标识符碰撞情况
小结
布局混淆并不会影响执行的过程、内存开销,甚至代码体积反而减少了。
数据混淆
JS拥有常见的7种数据类型,number、string、boolean、unfined、null、Object
数字混淆
数据混淆有常见:进制转换、数字分治、其他
- 进制转换
将十进制转化为二进制、八进制、十六进制等,从而达到“混淆”的目的
- 数学分治
简而言之就是将数拆开,例如 2 = 1 + 1,再辅以数学公式等
- 其他
重新赋值等
字符串混淆
字符串混淆常见的有编码转换、加密。常见的有hash、base64、md5等
boolean
我们都知道Boolean值为True、False。根据对boolean的处理,变成难以显示阅读的代码。例如![] = False, !![] = True.
控制混淆
控制混淆是指对程序的控制流进行转换变化,常见的方式有插入僵尸代码、控制流平坦化
插入僵尸代码:插入僵尸代码即插入无用的代码,增强调试难度
控制流平坦化:控制流平坦化,将原本的的执行流程平坦化。具体可自行搜索
预防混淆
主要体现在 提高反混淆的难度或检测现有混淆器中的漏洞设计
代码混淆总结
万变不离其宗,无论是代码压缩、代码混淆都离不开一个宗旨,在不改变原有的结果情况下对代码(这里指JS)进行处理。处理的方式包含但不限于,等值转换、运算分割。
设备指纹防护
设备指纹通过收集客户端设备的特征信息对用户与“机器人”进行甄别。web设备指纹主要包含:
浏览器端环境检测
浏览器设别标识
特征识别Hook
JS特征识别
做爬虫的朋友一定使用过NodeJs,这个工具。也时常借用与Nodejs来模拟JS,但Nodejs的api和指纹浏览器有不一样。如果服务端获取到客户端,那么就可以对指纹不一致的机器人,进行防范。
正如你我所知的那般,知道的越多,不知道的越多。
推荐阅读与了解
风控要略:互联网业务反欺诈之路
Jsfuck(github):https://github.com/aemkei/jsfuck
基于控制混淆和布局混淆的代码混淆系统-王岩(论文)