瀏覽器解碼的順序是: HTML解碼->URL解碼(目前只發(fā)現(xiàn)a標(biāo)簽的href屬性會進(jìn)行該解碼)->JS解碼
HTML的解碼機(jī)制
<input type="value1" id="value2" value="value3" onclick="value4" />
對于整個HTML頁面而言,會進(jìn)行HTML解碼的只有標(biāo)簽內(nèi)的value部分,即上面所述的value1到value4
例如
<input type="button" value="exec" onclick="confirm('123')" />
會被解碼為
<input type="button" value="exec" onclick="confirm('123')">
但是
" (雙引號)
是不會進(jìn)行HTML解碼的
HTML編碼包括實(shí)體編碼和兩種進(jìn)制編碼&#xH(十六進(jìn)制格式)、&#D(十進(jìn)制格式)
JS的解碼機(jī)制
對于整個HTML頁面而言,會進(jìn)行JS解碼的有兩個地方,一個是HTML進(jìn)行解碼的部分,即
<input type="value1" id="value2" value="value3" onclick="value4" />
標(biāo)簽內(nèi)的value部分,另一個是<script>標(biāo)簽所包圍的區(qū)域
JS只會對變量名、類名、函數(shù)名進(jìn)行UNICODE形式(\uH)的解碼
例如
<input type="button" value="exec" onclick="\u0063\u006f\u006e\u0066\u0069\u0072\u006d('123')" />
會被解析為
<input type="button" value="exec" onclick="confirm('123')">
而
<script>
var \u0069\u006d\u0067\u0031 = '<img src=@ onerror=alert(123) />';
\u0064\u006f\u0063\u0075\u006d\u0065\u006e\u0074.\u0077\u0072\u0069\u0074\u0065(\u0069\u006d\u0067\u0031);
</script>
會被解析為
<script>
var img1 = '<img src=@ onerror=alert(123) />';
document.write(img1);
</script>
JS會對傳入函數(shù)的參數(shù)進(jìn)行UNICODE形式(\uH)、16進(jìn)制(\xHH)或者 8進(jìn)制(\OO)的解碼
<input type="button" value="exec" onclick="confirm('\x31\62\u0033')">
會被解析為
<input type="button" value="exec" onclick="confirm('123')">
傳入的參數(shù)要么是數(shù)字,要么是字符串,是字符串的話一定要包含在’(單引號)里面,即不能對最外層的'進(jìn)行編碼
URL的解碼規(guī)則
<a >link</a>
中的http://不可以被URL編碼
<a href="javascript:alert(3)">link</a>
中的javascript:也不可以被URL編碼
從中可以看出協(xié)議是不可以被URL編碼的