浏览器解码

2017-12-31  本文已影响0人  Linkingg

浏览器解码的顺序是: HTML解码->URL解码(目前只发现a标签的href属性会进行该解码)->JS解码
HTML的解码机制
<input type="value1" id="value2" value="value3" onclick="value4" />

对于整个HTML页面而言,会进行HTML解码的只有标签内的value部分,即上面所述的value1到value4
例如

<input type="&#x62;&#x75;&#x74;&#x74;&#x6F;&#x6E;" value="&#x65;&#x78;&#x65;&#x63;" onclick="&#x63;&#x6F;&#x6E;&#x66;&#x69;&#x72;&#x6D;&#x28;&#x27;&#x31;&#x32;&#x33;&#x27;&#x29;" />

会被解码为

<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编码的

上一篇下一篇

猜你喜欢

热点阅读