打开一个浏览器,其基本的功能如下:
渲染 DOM
刷新(重新加载)
执行 js 脚本
浏览器组成
DOM+BOM+js 引擎 = 浏览器
DOM
文档对象模型(DOM): DOM 是 JavaScript 操作网页内容的接口。当网页加载完成后,浏览器会将网页的结构(HTML 文档)解析成一个由节点组成的树形结构,这个结构就是 DOM。JavaScript 可以通过 DOM 提供的接口来操作网页的结构、内容和样式。
BOM
浏览器对象模型(BOM): BOM 是浏览器提供的 JavaScript 对象集合,它使 JavaScript 可以与浏览器窗口进行交互,比如控制浏览器的导航、获取浏览器窗口的大小和位置等。各个浏览器对 BOM的实现可能有所不同。
js 引擎
js 引擎用于解析和执行 JavaScript 代码。它将 JavaScript 代码转换为计算机能够理解和执行的指令的核心部分。JavaScript 引擎的主要任务是将 JavaScript 代码编译成可执行的机器码,并在运行时执行这些代码。
常见的 js 引擎有:
•V8 引擎(google chrome)•SpiderMonkey(firefox)•Chakra(edge)•quickjs(ffg)
JavaScript 通过操作 DOM 来实现对网页内容的动态改变和交互,同时通过 BOM 来控制浏览器的行为和提供与浏览器窗口相关的信息和功能。
简单来说
DOM负责:
1、html 增删改查api
2、html 数据格式
3、渲染 Canvas...
BOM 负责:
1、浏览器自己实现的一些类包括 location navigator
2、ssl btoa AES DES...
而 js 引擎其实就是js 解释器
例如 document.createElement("div")
在浏览器的 console 中可以运行,但是本地无法执行,因为本地没有 BOM。
另外,浏览器实现的对象,会添加一个特性,只读,不可写,但是在本地环境中没有 dom,bom,就可以进行重写。
伪造
伪造环境和前面提到的抠取 js 是两种不同的方法,抠取 js 是删除环境的一些代码,一般简单的网站直接抠代码即可,复杂一点的可能就要进行环境伪造。
特点
支持多线程,爬取速度快,而 selenium 需要开启一个新的进程,并且开放权限太少,资源占用较高。
如何伪造
伪造也分为两种,全部伪造和给指定的网站伪造。
1、全部伪造
例如 python 中的 jsdom,实现了完整的 DOM 环境,nodedjs 完整实现了 DOM+BOM ,但是都容易被检测。
特点:费时费力一劳永逸
2、给指定网站伪造 这就需要知道网站检测了什么内容,可以通过如下方法:
•通过调试•全局异常捕获•本地环境运行看报错
以 navigator 的 ua 头为例,首先在 console 中查看:
到本地环境中,运行
var navigator = {
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
执行 navigator.userAgent:
原文始发于微信公众号(Crush Sec):js 逆向系列05-浏览器和 js 的关系
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论