浏览器解码的顺序是: HTML解码->URL解码(目前只发现a标签的href属性会进行该解码)->JS解码
HTML的解码机制
<input type="value1" id="value2" value="value3" onclick="value4" />
对于整个HTML页面而言,会进行HTML解码的只有标签内的value部分,即上面所述的value1到value4
例如
<input type="button" value="exec" onclick="confirm('123')" />
会被解码为
<input type="button" value="exec" onclick="confirm('123')">
但是
" (双引号)
是不会进行HTML解码的
HTML编码包括实体编码和两种进制编码&#xH(十六进制格式)、&#D(十进制格式)
JS的解码机制
对于整个HTML页面而言,会进行JS解码的有两个地方,一个是HTML进行解码的部分,即
<input type="value1" id="value2" value="value3" onclick="value4" />
标签内的value部分,另一个是<script>标签所包围的区域
JS只会对变量名、类名、函数名进行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会对传入函数的参数进行UNICODE形式(\uH)、16进制(\xHH)或者 8进制(\OO)的解码
<input type="button" value="exec" onclick="confirm('\x31\62\u0033')">
会被解析为
<input type="button" value="exec" onclick="confirm('123')">
传入的参数要么是数字,要么是字符串,是字符串的话一定要包含在’(单引号)里面,即不能对最外层的'进行编码
URL的解码规则
<a href="http://www.baidu.com">link</a>
中的http://不可以被URL编码
<a href="javascript:alert(3)">link</a>
中的javascript:也不可以被URL编码
从中可以看出协议是不可以被URL编码的
网友评论