参考链接:http://bobao.360.cn/learning/detail/292.html
题目:http://test.attacker-domain.com/browserparsing/answers.txt

<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
这个代码不会被执行,原因是进行url解析后为“javascript:alert(1)” 而js解析器在url解析之前并不会识别出javascript
<a
href="javascript:%61
%6c%65%72%74%28%32%29">这个代码会被执行,原因是会先进行html解析后会出现“javascript:”然后href会继续进行url解析,解析出“alert(2)”然后由于url解析前已经解析出“javascript:”所以该js代码会被执行
<a href="javascript%3aalert(3)"></a>
这个代码不会被执行,原因同第一个题目,url解码之前,"javascript:"并不会被js解析器识别
<div><img src=x onerror=alert(4)></div>
这个代码不会被执行,html解码前img标签不会被识别,所以img标签的内容并不会被解析
<textarea><script>alert(5)</script></textarea>
这个代码不会被执行,html解析编码前<script>标签并不会被识别所以脚本并不会被执行
<textarea><script>alert(6)</script></textarea>
这个也不会被执行,有个前置知识 
在HTML中有五类元素:
1.  空元素(Void elements),如<area>,<br>,<base>等等
2.  原始文本元素(Raw text elements),有<script>和<style>
3.  RCDATA元素(RCDATA elements),有<textarea>和<title>
4.  外部元素(Foreign elements),例如MathML命名空间或者SVG命名空间的元素
5.  基本元素(Normal elements),即除了以上4种元素以外的元素
五类元素的区别如下:
1.  空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。
2.  原始文本元素,可以容纳文本。
3.  RCDATA元素,可以容纳文本和字符引用。
4.  外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释
5.  基本元素,可以容纳文本、字符引用、其他元素和注释 
在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。在这个状态中,如果遇到“<”字符,它会转换到“RCDATA小于号状态”。如果“<”字符后没有紧跟着“/”和对应的标签名,解析器会转换回“RCDATA状态”。这意味着在RCDATA元素标签的内容中(例如<textarea>或<title>的内容中),唯一能够被解析器认做是标签的就是“</textarea>”或者“</title>”。当然,这要看开始标签是哪一个。因此,在“<textarea>”和“<title>”的内容中不会创建标签,就不会有脚本能够执行。这也就解释了为什么该脚本不会被执行。 
但是<a><script>alert(1)</script></a>会被执行,这也是元素类型不同导致的差异。
<button onclick="confirm('7');">Button</button>
这个代码是可以执行的,因为在html解码前onclick属性已经存在 ,html解析完成后,onclick属性即可正常触发
<button onclick="confirm('8\u0027);">Button</button>
这个代码不会被执行,\uXXXX被称为Unicode转义序列,在这里是被解析只会视为字符常量
1、<script>aler&#116(9)&#59</script>
2、<script>\u0061\u006c\u0065\u0072\u0074(10);</script> 
3、<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script> 
4、<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script> 
5、<script>alert('13\u0027)</script> 
6、<script>alert('14\u000a')</script> 
2和6会执行,前置知识 
所有的“script”块都属于“原始文本”元素。“script”块有个有趣的属性:在块中的字符引用并不会被解析和解码。如果你去看“脚本数据状态”的状态转换规则,就会发现没有任何规则能转移到字符引用状态。这意味着什么?这意味着问题9中的脚本并不会执行。所以如果攻击者尝试着将输入数据编码成字符实体并将其放在script块中,它将不会被执行。
那像“\uXXXX”(例如\u0000,\u000A)这样的字符呢,JavaScript会解析这些字符来执行吗?简单的说:视情况而定。具体的说就是要看被编码的序列到底是哪部分。首先,像\uXXXX一样的字符被称作Unicode转义序列。从上下文来看,你可以将转义序列放在3个部分:字符串中,标识符名称中和控制字符中。
字符串中:当Unicode转义序列存在于字符串中时,它只会被解释为正规字符,而不是单引号,双引号或者换行符这些能够打破字符串上下文的字符。这项内容清楚地写在ECMAScript中。因此,Unicode转义序列将永远不会破环字符串上下文,因为它们只能被解释成字符串常量。  
标识符名称中:当Unicode转义序列出现在标识符名称中时,它会被解码并解释为标识符名称的一部分,例如函数名,属性名等等。这可以用来解释问题10。如果我们深入研究JavaScript细则,可以看到如下内容:“Unicode转义序列(如\u000A\u000B)同样被允许用在标识符名称中,被当作名称中的一个字符。而将'\'符号前置在Unicode转义序列串(如\u000A000B000C)并不能作为标识符名称中的字符。将Unicode转义序列串放在标识符名称中是非法的。”  
控制字符:当用Unicode转义序列来表示一个控制字符时,例如单引号、双引号、圆括号等等,它们将不会被解释成控制字符,而仅仅被解码并解析为标识符名称或者字符串常量。如果你去看ECMAScript的语法,就会发现没有一处会用Unicode转义序列来当作控制字符。例如,如果解析器正在解析一个函数调用语句,圆括号部分必须为“(”和“)”,而不能是\u0028和\u0029。
总的来说,Unicode转义序列只有在标识符名称里不被当作字符串,也只有在标识符名称里的编码字符能够被正常的解析。 
所以问题1中<script>块中的字符引用并不会被解析,自然也不会被执行了;问题2中的Unicode转义序列处于‘alert’这一标识符位置上所以可以被解析执行;问题3中‘alert(11)’并不是一个有效的标识符;问题4是因为 ‘\u0031\u0032’ 不会被识别为字符串,如果想要被识别为字符串需要加引号也就是这样‘'\u0031\u0032'’ 最后语句 
<script>\u0061\u006c\u0065\u0072\u0074('\u0031\u0032')</script> 这样就会正常执行了;问题5 不会执行的原因是'\u0027'仅仅会被解释成单引号文本,而此时字符串是未闭合的;问题6会执行是因为'\u000a'会被解析为换行符文本,而不是真正的换行符操作。
<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:%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)'由于href出现就会对'%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'进行url解码得到'\u0061\u006c\u0065\u0072\u0074'又在这个解析操作之前出现了'javascript:',那么接下来就会对'\u0061\u006c\u0065\u0072\u0074'进行unicode转义解析由于解析是alert函数所以就会正常执行了。

哎,编码问题 html编码在文章中被自动解码了,导致一下题目编码有问题,大家可以看文首发的链接,题目都在那里面。