瀏覽器解碼順序測試


測試

瀏覽器的解析順序(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('\x25\x06\x01')>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('\x25\x06\x01')>code</a>
顯示 <a href="javascript:alert('\x25\x06\x01')">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編碼;其他編碼類似;

當執行到什么環境的時候,組成這個環境的元素還在編碼的狀態就會出現錯誤,環境不完整,造成無法解析;普通的值一般都是可以編碼的;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM