目录
问题一:
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
无法弹窗
原因:urlcode无法识别协议(javascript:
)
html解码顺序:1、html实体编码 2、urlcode编码 3, unicode编码
问题二:
<ahref="javascript:%61%6c%65%72%74%28%32%29">
可以弹窗
首先
先HTML实体编码解码,得到
<a href="javascript:%61%6c%65%72%74%28%32%29">
href中为URL,URL模块可识别为javascript
协议,进行URL解码,得到
<a href="javascript:alert(2)">
由于是javascript协议,解码完给JS模块处理,于是被执行
问题三:
<a href="javascript%3aalert(3)"></a>
不能弹窗
依然是编码了协议 (javascript:)冒号也属于协议中一部分,导致了url模块不认识这个协议,所以不能弹窗。
问题四:
<div><img src=x οnerrοr=alert(4)></div>
不能弹窗
HTML解析器作为一个状态机 在解析过程中,任何时候它只要遇到一个'<'符号(后面没有跟'/'符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”......最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。
当解析器解析完“<div>”并处于“数据状态”时,“<”和“>”字符 将会被解析,当解析器遇到“&”字符,它会知道这是“数据状态的字符引用”,但是不会被执行。因为解析器在解析这个字符引用后不会转换到“标签开始状态”。只能原样输出。
问题五:
<textarea><script>alert(5)</script></textarea>
不能弹窗
RCDATA的概念 在HTML中有五类元素:
-
空元素(Void elements),如<area>, ,<base>等等
-
原始文本元素(Raw text elements),有<script>和<style>
-
RCDATA元素(RCDATA elements),有<textarea>和<title>
-
外部元素(Foreign elements),例如MathML命名空间或者SVG命名空间的元素
-
基本元素(Normal elements),即除了以上4种元素以外的元素
五类元素的区别如下:
-
空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。
-
原始文本元素,可以容纳文本。
-
RCDATA元素,可以容纳文本和字符引用。
-
外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释
-
基本元素,可以容纳文本、字符引用、其他元素和注释
这是一种可以容纳字符引用的情况“RCDATA状态中的字符引用”。这意味着在<textarea>和<title>标签中的字符引用会被HTML解析器解码。这里要再提醒一次,在解析这些字符引用的过程中不会进入“标签开始状态”。这样就可以解释问题5了。和问题四的原因一样,<解析<出来后不能进入“标签开始状态”
问题六:
<textarea><script>alert(6)</script></textarea>
不能弹窗
<textarea><title>下写任何标签都是不能执行的
问题七:
<button οnclick="confirm('7');">Button</button>
可以弹窗
'html实体编码被解码成 '
问题八:
<button οnclick="confirm('8\u0027);">Button</button>
不能弹窗
js中unicode编码出符号,但是不能识别符号()" ' + - 。
问题九:
<script>alert(9);</script>
不能弹窗
原始文本元素(Raw text elements),有<script>和<style> 只能容纳文本 原样输出
问题十:
<script>\u0061\u006c\u0065\u0072\u0074(10);</script>
可以弹窗
js中unicode编码出字符,JS中能够识别字符
问题十一:
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>
不能弹窗
和问题八一样不能识别符号
问题十二:
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
不能弹窗
\u0031\u0032
在解码的时候会被unicode解码为字符串12,
注意是字符串,不是数字,文字显然是需要引号的
问题十三:
<script>alert('13\u0027)</script>
不能弹窗
和问题八一样
问题十四:
<script>alert('14\u000a')</script>
可以弹窗
\u000a
在JavaScript里是换行,就是\n
,直接执行
问题十五:
<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)"></a>
可以弹窗
先HTML实体编码解码,得到
<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)"></a>
javascript:协议出来后 urlcode 才能识别,在href中由URL模块处理,解码得到
javascript:\u0061\u006c\u0065\u0072\u0074(15)
然后由JS模块处理,解码得到
javascript:alert(15)