xss和实体编码的一点小思考

首先,浏览器渲染分以下几步:

  1. 解析HTML生成DOM树。
  2. 解析CSS生成CSSOM规则树。
  3. DOM树与CSSOM规则树合并在一起生成渲染树。
  4. 遍历渲染树开始布局,计算每个节点的位置大小信息。
  5. 将渲染树每个节点绘制到屏幕。

已知的问题:

"" 之间的xss我们都知道可以使用伪协议,那么如果冒号或者javascript等关键字被过滤了我们应该如何解决?

我们可以在标签内通过实体编码触发xss:
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;%6
1%6c%65%72%74%28%32%29">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是可以操作节点进行增删改操作的。
原文地址:https://www.cnblogs.com/escape-w/p/10162831.html