測試
瀏覽器的解析順序(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=javascript:alert('a')>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('&#x61;')>code</a></br>
</body>
</html>
經過瀏覽器顯示的結果:

第5個例子作廢第5個例子作廢第5個例子作廢
經過上面我們可以知道:瀏覽器顯示一次做了哪些解碼:
通過2知道本地訪問並沒有做url解碼;
通過4知道沒有做js解碼;
通過8知道做了一次html解碼;
如表:
| 1 | 2 | |
|---|---|---|
| 源代碼 | <a href=javascript:alert('a')>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('&#x61;')>code</a> |
| 顯示 | <a href="javascript:alert('%5c%78%36%31')">code</a> |
<a href="javascript:alert('a')">code</a> |
| 二次顯示 | ![]() |
![]() |
| 解釋 | 二次顯示做了URL和JS的解碼,並且解碼順序為先URL后JS | 一次顯示執行了HTML解碼,二次顯示沒有解碼; |
總結
解析編碼的時候是先構建DOM樹,我的理解就是在自己環境中是不能編碼自己的,編碼其他類似不影響解析HTMLDOM樹的元素,就可以進行解碼,而且需要完整的環境執行起來才可以進行解析;
HTMl實體字符是為了在HTML文檔中能夠顯示一些預定義的字符;其他的一些編碼,為了轉義顯示或者是傳輸方便,可以類比HTML實體編碼套用,就是不能編碼'自己'的或者自己的'爸爸';
JSUnicode編碼,需要\u開頭,四位,不足位補0;表中的a的JSUnicode編碼;
所以:要正常解析HTML的DOM節點的話,就不能對構成DOM的元素進行HTML編碼;其他編碼類似;
當執行到什么環境的時候,組成這個環境的元素還在編碼的狀態就會出現錯誤,環境不完整,造成無法解析;普通的值一般都是可以編碼的;






