zoukankan      html  css  js  c++  java
  • 浏览器解码顺序测试

    测试

    浏览器的解析顺序(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:<a href=javascript:alert('a')>code</a>

    测试中我们直接在本地访问,也就略过了服务器到浏览器这个过程,所以下面的文件就是源代码;

    这个例子就是下图中源代码到显示再到二次显示的过程

    进行如下变形:

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    HTML十六进制编码1:<a href=j&#x61;vascript:&#x61;lert('&#x61;')>code</a></br>
    URL编码2:<a href=j%61vascript:alert('%61')>code</a></br>
    URL编码3:<a href=javascript:%61lert('%61')>code</a></br>
    JS十六进制编码4:<a href=javascript:alert('x61')>code</a></br>
    JS十六进制编码5:<a href=javascript:&x61lert('x61')>code</a></br>
    先URL后JS十六进制6:<a href=javascript:alert('x25x06x01')>code</a></br>
    先JS十六进制后URL7:<a href=javascript:alert('%5c%78%36%31')>code</a></br>
    双重HTML8:<a href=javascript:alert('&#x26;&#x23;&#x78;&#x36;&#x31;&#x3b;')>code</a></br>
    </body>
    </html>
    

    经过浏览器显示的结果:

    第5个例子作废第5个例子作废第5个例子作废

    经过上面我们可以知道:浏览器显示一次做了哪些解码:

    通过2知道本地访问并没有做url解码;

    通过4知道没有做js解码;

    通过8知道做了一次html解码;

    如表:

    1 2
    源代码 <a href=j&#x61;vascript:&#x61;lert('&#x61;')>code</a> <a href=j%61vascript:alert('%61')>code</a>
    显示 <a href="javascript:alert('a')">code</a> <a href="j%61vascript:alert('%61')">code</a>
    二次显示 无法访问403
    解释 第一次做了HTML解码; 一次显示没有解码;超链接伪协议不完整,不会触发js弹窗;
    3 4
    源代码 <a href=javascript:%61lert('%61')>code</a> <a href=javascript:alert('x61')>code</a>
    显示 <a href="javascript:%61lert('%61')">code</a> <a href="javascript:alert('x61')">code</a>
    二次显示
    解释 二次显示说明执行了URL解码,对比2,伪协议完整,本身没有编码,对后面进行URL解码; 一次显没有解码;二次显示做了JS解码;
    5作废作废作废 6
    源代码 <a href=javascript:alert('x25x06x01')>code</a>
    显示 <a href="javascript:alert('x25x06x01')">code</a>
    二次显示
    解释 对比7
    7 8
    源代码 <a href=javascript:alert('%5c%78%36%31')>code</a> <a href=javascript:alert('&#x26;&#x23;&#x78;&#x36;&#x31;&#x3b;')>code</a>
    显示 <a href="javascript:alert('%5c%78%36%31')">code</a> <a href="javascript:alert('&#x61;')">code</a>
    二次显示
    解释 二次显示做了URL和JS的解码,并且解码顺序为先URL后JS 一次显示执行了HTML解码,二次显示没有解码;

    总结

    解析编码的时候是先构建DOM树,我的理解就是在自己环境中是不能编码自己的,编码其他类似不影响解析HTMLDOM树的元素,就可以进行解码,而且需要完整的环境执行起来才可以进行解析;

    HTMl实体字符是为了在HTML文档中能够显示一些预定义的字符;其他的一些编码,为了转义显示或者是传输方便,可以类比HTML实体编码套用,就是不能编码'自己'的或者自己的'爸爸';

    JSUnicode编码,需要u开头,四位,不足位补0;表中的a的JSUnicode编码;

    所以:要正常解析HTML的DOM节点的话,就不能对构成DOM的元素进行HTML编码;其他编码类似;

    当执行到什么环境的时候,组成这个环境的元素还在编码的状态就会出现错误,环境不完整,造成无法解析;普通的值一般都是可以编码的;

  • 相关阅读:
    markdown
    线段树模板
    Trie模板 UVALive 3942 Remember the Word
    使用swift写sprite Kit的模仿微信打飞机游戏
    Graffiti support page
    使用代码控制ScrollView的contentSize
    资料整理
    pd.to_sql()用法
    如何将表格的数据导入到mysql
    安装启动MySQL8.0,报错:1053
  • 原文地址:https://www.cnblogs.com/p0laris/p/11898322.html
Copyright © 2011-2022 走看看