解码规则

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

解码顺序

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

HTML解析器

1、html解析器以状态机的方式运行

状态流程图为:

即:Data—》Tag open----》Tag name —》Data

注意:如果我们的标签是在Data状态下被解析出来的,那么标签将作为一种文本输出来,
举例:<p>Hello<p>
初始状态为Data state ,当遇到<时,状态转为 Tag open,读取a-z某个字符创建开始标签,然后状态变为Tag name ,知道读取到>,状态变为Data,接着读取到H会识别并生成一个字符,相应得会为Hello中的每个字符生成一个字符符号,之后遇到<,又变为Tag open,读取到/则会创建一个闭合标签,并将状态改为Tag name,直到遇到>,后回到Data state。

注意:HTML解析器处于Data State、RCDATA State 、Attribute Value State(属性值),字符实体会被解码为对应的字符

2、原始文本元素

特性:该元素标签中的实体不会被HTML解码
标签:script,style
举例:标签中的实体字符不会被html解码,因此不会执行js

<script>alert&#40;1)</script>
3、RCDATA 元素

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

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

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、当javascript没有被编码时

<a href = "javascript:alert(3)">hhhhh<a>

JS编码:

<a href="javascript:\u0061\u006c\u0065\u0072\u0074(3)">hhhhhh</a>

再对JS编码来一个URL编码

<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(3)">hhhhhh</a>

这个是可以成功执行的,当HTML解析到href时,交给URL处理,URL发现了javascript:,把后面的数字解码后交由JavaScript处理,所以会弹出

例子

<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">hhhh</a>
URL encoded "javascript:alert(1)" //冒号(:)没有被编码
Answer: The javascript will NOT execute.

HTML没有编码,不用考虑,根据href,URL模块处理,但是协议没办法识别(即编码的JavaScript:),URL会解码出来,但JS不会被执行,所以url编码的XSS,javascript:一定不能被url编码,编码后无法识别,js还是不能执行

<a href="javascript:%61%6c%65%72%74%28%32%29">
Character entity encoded "javascript" and URL encoded "alert(2)"
Answer: The javascript will execute

HTML先解码得到:

<a href="javascript:%61%6c%65%72%74%28%32%29">

href中为URL,URL模块可识别为javascript协议,进行URL解码,得到

<a href="javascript:alert(2)">

由于是javascript协议,解码完给JS模块处理,于是被执行

<div>&#60;img src=x οnerrοr=alert(4)></div>
Character entity encoded < and >
Answer: The javascript will NOT execute.

当HTML解析到&#60;时,此时的状态为Data,会被解码,但是不能创建img标签,因为不是Tag open状态,所以解码后被当做文本,不会执行

<button onclick="confirm('7');">Button</button>
Character entity encoded '
Answer: The javascript will execute.

这里onclick中为标签的属性值,会被HTML解码,得到

<button onclick="confirm('7');">Button</button>

然后被执行

<button onclick="confirm('8\u0027);">Button</button>
Unicode escape sequence encoded '
Answer: The javascript will NOT execute.

不需要HTML解码,onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,'显然不行,JS执行失败。

<script>&#97;ler&#116(9)&#59</script>
Character entity encoded alert(9);
Answer: The javascript will NOT execute.

不会被执行,script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,JS也认不出来,执行失败

参考链接

https://blog.csdn.net/baidu_38844729/article/details/109328472
https://xz.aliyun.com/t/5863

web安全---浏览器解析提交数据的过程相关推荐

  1. 浏览器解析html过程,浏览器解析HTML,CSS过程

    原标题:浏览器解析HTML,CSS过程 每个浏览器都会有自己的呈现引擎,不同内核浏览器之间的解析顺序和方法存在差异,但都是大同小异: a)呈现引擎,呈现引擎一开始会从网络层获取请求文档的内容,内容的大 ...

  2. 谈一谈浏览器解析CSS选择器的过程【前端每日一题-6】

    谈一谈浏览器解析CSS选择器的过程? 这是一道发散题,可以根据自己的理解自行解答. 在开始前,我们必须了解一个真相:为什么排版引擎解析 CSS 选择器时一定要从右往左解析? 简单的来说:浏览器从右到左 ...

  3. [css] 说说浏览器解析CSS选择器的过程?

    [css] 说说浏览器解析CSS选择器的过程? 按照从上到下,从右到左的顺序解析. 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起 ...

  4. web项目通过ajax提交数据太大报错

    通过ajax提交大数据 $.ajax({ url:"", data:{xx:xx} }) 这样子大大的字符串四五个一块提交.导致的提交的请求太大 idea报错 浏览器页面报错 解决 ...

  5. 自动生成web服务器日志解析规则

    2019独角兽企业重金招聘Python工程师标准>>> 当前web服务器的多样化使得访问日志的数据清洗变得越来越复杂,企业需要投入专业的数据清洗人员编写数据清洗规则(解析规则或者解析 ...

  6. Web 四种常见的POST提交数据方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  7. html怎么用chrome测试,通过chrome调试器测试了解浏览器解析和渲染HTML的过程

    基础知识了解chrome的Timeline工具 主要过程 解析与构建DOM树1外部样式脚本并行加载外部样式会阻塞后续脚本执行直到外部样式加载并解析完毕 2 外部样式不会阻塞后续脚本的加载但会阻塞后续脚 ...

  8. 浏览器字体大小设置_CSS之 浏览器解析样式的过程

    阅读本文约需要10分钟 大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务! 1.长期为你提供最优质的学习资源! 2.给你解决技术问题! 3.每天在朋友圈里分 ...

  9. 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程

    浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互. 服务器其实就是性能比较高的计算机,这些计算机 24 小时不断电. 不关机. 开发者在本地开发出 HT ...

最新文章

  1. PageHelper 使用 ThreadLocal 的线程复用问题
  2. 明天是你的生日~~~
  3. SpringBoot rest映射及源码解析
  4. 【Coursera课程笔记】Web智能和大数据Week3_MapReduce
  5. 解决代码中重复的捕获 promise 错误的 try catch 语句
  6. linux内核工程师必须知道的三十道题
  7. 用100多行python代码开发java代码生成器
  8. Ubuntu 16.04 双网卡 同时上内外网
  9. 程序员必备的技术社区都有哪些?
  10. 网站挂马检测 php,Python实现的检测网站挂马程序
  11. 英语阅读——The confusing pursuit of beauty
  12. Nobody gives away anything valuable for free.
  13. android系统方法裁剪图片 华为手机显示为圆
  14. return 的作用
  15. Tor 和I2P 网络正遭大规模DDoS 攻击
  16. Keras-gpu版本安装教程(亲测有效)
  17. 零点极点传递函数以及伯德图
  18. ffmpeg常用命令汇总(倒放/左右翻转/上下翻转/倍速/压缩/去声音/加水印/画中画/缩放等)
  19. python中国-Python China
  20. 关于MySQL 中存取图片数据

热门文章

  1. React 篇 Search Bar and content Table
  2. 如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
  3. Module的加载实现
  4. Day1 了解web前端
  5. layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值
  6. Maven常用的构建命令
  7. Vue中浏览器的的前进和后退
  8. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
  9. 分解 python_面试官:如何用Python实现将一个整数分解成质因数?
  10. java文件解压文件_java 文件解压缩