首先, 浏览器渲染分以下几步:
解析 html 生成 DOM 树.
解析 CSS 生成 CSSOM 规则树.
将 DOM 树与 CSSOM 规则树合并在一起生成渲染树.
遍历渲染树开始布局, 计算每个节点的位置大小信息.
将渲染树每个节点绘制到屏幕.
已知的问题:
"" 之间的 xss 我们都知道可以使用伪协议, 那么如果冒号或者 JavaScript 等关键字被过滤了我们应该如何解决?
我们可以在标签内通过实体编码触发 xss:
- <a href="javascript:%6
- 1lert(2)">
- test
- </a>
浏览器遇到 HTML 标签 会对标签里面的实体编码进行解码 如果解码后存在 JavaScript: 则会执行 JS 伪协议触发 xss
那么我这个菜鸡开始思考, 既然实体编码会被 HTML 自解码, 那么为什么过滤 xss 的方法之一是实体编码特殊符号呢 为什么 <> 的实体编码没有自解码后被解析成一个新的 dom 节点呢? 通过查询资料我得到了一个答案:
浏览器最早开始解析 HTML, 将标签转化为内容树中的 DOM 节点, 此时识别标签的时候, HTML 解析器是无法识别那些被实体编码的内容的, 只有建立起 DOM 树, 才能对每个节点的内容进行识别, 如果出现实体编码, 则会进行实体解码. 在此基础上, JavaScript DOM API 参与进来, 可以对 DOM 树进行修改, 改变 DOM 树的结构和内容.
这段话说的比较清楚了, 在 dom 树构建之时, HTML 实体编码是没有被自解码的, 那么此时 dom 树的节点结构就已经被固定了. 后续自解码以后并不会影响到 dom 树 / 节点 / 标签的结构. 这个道理和 sql 中的预编译是有些类似的. 之后的自解码以后获得的 <> 将不会被解析成新的节点. 但并不是说 dom 树构建完毕后就不能被改变了. JS 是可以操作节点进行增删改操作的.
来源: http://www.bubuko.com/infodetail-2894080.html