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