浏览器解码规则详解

解码规则

浏览器解码遵循这样一个规则:

  1. html解析器对html文档进行解析,完成html解码并且创建DOM树
  2. JavaScript 或者CSS解析器对内联脚本进行解析,完成JS、CSS解码
  3. url解码会根据url所在的顺序不同而在JS解码前或者解码后

解码顺序

html解析第一步执行,而JS解析和url解析则要根据情况而定

html解析器

1、html解析器以状态机的方式运行,举例:<p>Hello</p>
状态流程为:Data—>Tag open—>Tag name—>Data—>Tag open—>Tag name—>Data

初始状态为Data state,当遇到<时,状态转为Tag open,读取到a-z某个字符会创建开始标签,此时状态转为Tag name,直到读取到>,状态又回到Data,接着读取到H会识别并生成一个字符,相应得会为Hello中的每个字符生成一个字符符号;之后遇到<,又转为Tag open,读取到 “/” 则创建一个闭合标签,并将状态变为Tag name,直到遇到>后回到Data state

注意:HTML解析器处于Data Stata、RCDATA State、Attribute Value State时,字符实体会被解码为对应的字符
举例:

<div>&#60;img src=x onerror=alert(4)&#62;</div>

其中&#60;&#62;会被解码为<>,但是不会触发JS执行,即不会弹窗
因为解码&#60;时处于Data状态,不是Tag open状态,不进入Tag open就不会创建标签,只会将&#60作为数据来处理;没有对应的标签,故不会触发

总结:对特殊字符做html编码可以有效防御XSS攻击

2、原始文本元素

特性:该元素标签中的实体字符不会被HTML解码
标签:script、style
举例:<script>alert&#40;&#49;&#41;</script>,标签中的实体字符不会被html解码,因此不会触发执行JS

3、RCDATA元素
特性 :html解析器遇到该元素标签时,会进入RCDATA状态,字符实体会被解析器解码
标签:textarea、title
举例:字符实体会被转码,但是不会执行JS,因为没有进入Tag open状态,其中<script>不会被解释为html标签

<textarea>&lt;script&gt;alert&#40;&#49;&#41;&lt;/script></textarea>
解码得到<textarea><script>alert(1)</script></textarea>

4、外部元素
<svg>遵循XML和SVG的定义
举例:可以弹窗,在XML中&#40;会被解析成(

<svg><script>alert&#40;1)</script>

JavaScript解析器

JavaScript中有三个地方可以出现JS编码
1、字符串

<script>alert(\u0031”);</script>
被编码的为1且是字符串,可以正常解码并触发执行

2、标识符

<script>\u0061\u006c\u0065\u0072\u0074(1);</script>
被编码的部分为alert字符,是函数名,属于在标识符中的情况,因此会被正常解码并执行JS

3、控制符
包含:单引号’ 双引号" 括号()等
特性:能被解码但不会被解释为控制字符,即失去特殊含义,只会被当作标识符或字符串的一部分

<script>alert\u0028″xss”);</script>
\u0028会被解码为( 但是不会触发JS,因为是控制符

URL解析器

1、URL的协议部分必须为ASCII字符,否则URL解析器的状态机将进入No Scheme状态

<a href="%6a%61%76%61%73%63%72%69%70%74:alert(1)"></a>
url编码部分为javascript,因为作为协议部分的"javascript"被编码,故不会触发JS

2、URL中的**😗*不能被以任何方式编码

<a href="javascript%3aalert(1)"></a>
:被url编码为%3a,导致url状态机进入No Scheme状态,故不会触发JS
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值