1. JavaScript反爬虫原理及原因
爬虫与网站安全,一个是矛,一个是盾。
你网站安全与否?
- 第一看安全措施是否到位,
- 第二,还得看数据价值是否会勾引到“爬虫”的注意。也就是说,除非没有爬虫盯上你的数据,否则反爬措施你必须步步到位!
2. Python调用JavaScript执行代码
PyExecJS库:
简介:
这个库主要是将 js 代码运行在本地的 js 环境中
优点:
- 有多种 js环境的选择,官方推荐了 PyV8、Node.js、PhantomJS、Nashorn 四种
缺点:
- 必须安装一种环境导致不是很轻量,而且调用时有一个启动环境过程,还是有明显缓慢的。
安装:
- 先安装好本地的js环境。推荐安装node.js,安装简单,执行效率也很不错
- pip install PyExecJS
>>> import execjs
# 实例化
>>> execjs.get().name # 查看调用的环境
'Node.js (V8)'
>>> ctx = execjs.compile(
""" # 执行 JS 语句
function add(x, y) {
return x + y;
}
"""
)
>>> ctx.call("add", 1, 2)#调用函数,传递参数
3
>>> with open('./test.js') as f: # 执行 JS 文件
... ctx = execjs.compile(f.read())
... ctx.call('add', 1, 2)
PyV8
-
这是 Google 官方将 Chrome V8 引擎用 Python 封装的库
-
和
PyExecJS
相比,这个库很轻量,不需要额外装 JS 环境,因为 V8 本身就是环境 -
同时也因为不需要启动外部环境,执行速度很快。
-
安装 : 在这里下载对应系统的二进制文件:emmetio/pyv8-binaries
>>> import PyV8 # 注意大小写 >>> with PyV8.JSContext() as ctx: ... ctx.eval(""" ... function add(x, y) { ... return x + y; ... } ... """) ... ctx.locals.add(1, 2)
3. 定位加密数据
面对js代码混淆和加密,我们在进行js逆向分析中,需要能够定位到所需数据存在的js文件中的具体位置。大致思路流程如下:
-
控制台中,通过ctrl + shift +F先进行全局搜索目标关键字;
-
在众多搜索结果中一一检索目标关键字所在的js文件路径,一般在source资源中检索;
-
检索到目标关键字所在的js文件后,格式化查看该js代码;
-
js文件内ctrl + F检索到关键字位置,分析其上下文代码;
-
如果引用到其他的参数或函数,则继续搜索对应关键字;
-
直至找到目标数据的加密算法——通常对应某一个函数或某一个函数的内的某一部分功能实现。
数据的编码与加密
base64编码
-
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
-
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
-
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本
-
是网络上最常见的
用Python实现base64编解码
编码
import base64
a = 'HC'.decode() #将‘HC’转为二进制
b = base64.b64encode(a) #将a转为base64编码
b.decode() #从二进制转回
base64.b64encode('HC'.encode()).decode() #简写'SEM=
解码
base64.b64decode('SEM=').decode()
'HC'
MD5加密算法
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
Python处理MD5加密
# 由于MD5模块在python3中被移除
# 在python3中使用hashlib模块进行md5操作
import hashlib
# 待加密信息
str = 'this is a md5 test.'
# 创建md5对象
m = hashlib.md5()
# Tips
# 此处必须encode
# 若写法为m.update(str) 报错为: Unicode-objects must be encoded before hashing
# 因为python3里默认的str是unicode
# 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes
b = str.encode(encoding='utf-8')
m.update(b)
str_md5 = m.hexdigest()
print('MD5加密前为 :' + str)
print('MD5加密后为 :' + str_md5)
# 另一种写法:b‘’前缀代表的就是bytes
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest()
print('MD5加密后为 :' + str_md5)