浏览器解码顺序测试
测试
浏览器的解析顺序(url)>html>css>js url解码看具体语境,并不一定在第一位;
使用下面的例子来说明各种解码;
为了方便贴上a字符的各种编码;
字符 | ASCII八进制 | ASCII十进制 | ASCII十六进制 | Base64 | URL编码 |
---|---|---|---|---|---|
a | 141 | 97 | 61 | YQ== | %61 |
JSUnicode | JS八进制 | JS十六进制 | HTML字符实体(特殊字符的编码) | HTML十进制编码 | HTML十六进制编码 |
\u0061 | \141 | \x61 | null | a | a |
eg:code
测试中我们直接在本地访问,也就略过了服务器到浏览器这个过程,所以下面的文件就是源代码;
这个例子就是下图中源代码到显示再到二次显示的过程
进行如下变形:
HTML十六进制编码1:code
URL编码2:code
URL编码3:code
JS十六进制编码4:code
JS十六进制编码5:code
先URL后JS十六进制6:code
先JS十六进制后URL7:code
双重HTML8:code
经过浏览器显示的结果:
第5个例子作废第5个例子作废第5个例子作废
经过上面我们可以知道:浏览器显示一次做了哪些解码:
通过2知道本地访问并没有做url解码;
通过4知道没有做js解码;
通过8知道做了一次html解码;
如表:
1 | 2 | |
---|---|---|
源代码 | code |
code |
显示 | code |
code |
二次显示 | 无法访问403 | |
解释 | 第一次做了HTML解码; | 一次显示没有解码;超链接伪协议不完整,不会触发js弹窗; |
3 | 4 | |
源代码 | code |
code |
显示 | code |
code |
二次显示 | ||
解释 | 二次显示说明执行了URL解码,对比2,伪协议完整,本身没有编码,对后面进行URL解码; | 一次显没有解码;二次显示做了JS解码; |
5作废作废作废 | 6 | |
源代码 | code |
|
显示 | code |
|
二次显示 | ||
解释 | 对比7 | |
7 | 8 | |
源代码 | code |
code |
显示 | code |
code |
二次显示 | ||
解释 | 二次显示做了URL和JS的解码,并且解码顺序为先URL后JS | 一次显示执行了HTML解码,二次显示没有解码; |
总结
解析编码的时候是先构建DOM树,我的理解就是在自己环境中是不能编码自己的,编码其他类似不影响解析HTMLDOM树的元素,就可以进行解码,而且需要完整的环境执行起来才可以进行解析;
HTMl实体字符是为了在HTML文档中能够显示一些预定义的字符;其他的一些编码,为了转义显示或者是传输方便,可以类比HTML实体编码套用,就是不能编码'自己'的或者自己的'爸爸';
JSUnicode编码,需要\u开头,四位,不足位补0;表中的a的JSUnicode编码;
所以:要正常解析HTML的DOM节点的话,就不能对构成DOM的元素进行HTML编码;其他编码类似;
当执行到什么环境的时候,组成这个环境的元素还在编码的状态就会出现错误,环境不完整,造成无法解析;普通的值一般都是可以编码的;