ASCII:查表
URLcode:%+ASCII转十六进制
HTML实体编码:&#x + ASCII码十六进制 或 &# + ASCII码十进制
unicode:查表
规则:
1. 协议不能被编码(如:javascript),但是可以被html实体编码,在页面直接被解码
2. 冒号也不能被编码,为协议的一部分
3. RCDATA元素:<textarea>,<title>
只能容纳文本内容和字符引用(实体编码)
4. JS代码中,符号不能被编码
5. 页面解码顺序:html实体编码 --- > urlcode ---> javascript(unicode)
6. <script> 标签是原始文本元素,只能容纳文本和函数,内容被html编码时,会被识别成文本,不被解析。
(允许unicode编码,js中的编解码就是unicode等,但不能编码符号)
实例:
1. 不弹窗,协议不能被urlcode编码
2. 弹窗,协议允许html实体编码,后面的允许urlcode编码
3. 不弹窗,冒号不能被urlcode编码,为协议的一部分
4. 不弹窗,虽然html直接被解码,但是不会进入标签开始状态
html解析过程:当遇到一个 < 时,就会进入标签开始状态,再进入数据状态,开始读取中间的数据部分,在标签内部再遇到 < 再进入标签开始状态,然后数据状态,再读取数据......
当<被编码后,读取到<时,解码成<,但不会进入标签开始状态,也不会进行数据状态,所以不会进行弹窗
5. 不弹窗,< 被解码后,不会进入标签开始状态,里面函数不能被解析
6. 不弹窗:<textarea>标签只能容纳文本内容和实体编码,<script>标签被识别成文本内容
7. 弹窗,html实体编码最先被解码," ' "在js识别之前已经被解码成 " ' "
8. 不弹窗, 符号只能被html编码,unicode编码是js中的编码
9. 不弹窗,<script>标签是原始文本元素,只能容纳文本内容,html实体编码被识别成文本
10. 弹窗,js中允许unicode编码,且没有编码符号
11. 不弹窗,js中允许unicode编码,但不能编码符号
12. 不弹窗,函数中数字也不能被编码
13. 不弹窗,js中不能编码符号
14. 可以弹窗,编码换行符后,仍然弹窗
15. 弹窗,html页面解析顺序:html-->urlcode-->javascript(unicode)
<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)"> test</a>
第1步. 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)"> test </a>
第2步. urlcode 解码
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(15)"> test </a>
第3步. unicode解码
<a href="alert(15)"> test</a>