【安全】web中的常见编码浅析浏览器解析机制

news2024/12/26 23:03:02

目录

常见编码

一、ASCII码

二、URL编码 

三、Unicode编码

四、HTML实体编码

结合编码理解浏览器解析机制


常见编码

一、ASCII码

        ASCII (American Standard Code for Information Interchange,美国信息交换标准代码)        

      计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有01两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000011111111

        上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。

        ASCII码对照  👉  点此进入

二、URL编码 

URL:

URL - 统一资源定位器(Uniform Resource Locator)

  • Web 浏览器使用 URL 从 Web 服务器请求页面。
  • URL 只能使用 ASCII 字符集 通过因特网进行发送。
  • 由于 URL 通常包含 ASCII 集之外的字符,因此必须将 URL 转换为有效的 ASCII 格式。

URL编码:

  • 将字符转换为可通过因特网传输的格式。
  • 使用后跟十六进制数字的 "%" 替代不安全的 ASCII 字符。
  • URL 不能包含空格。URL 编码通常使用加号(+)或 %20 替代空格

     👉URL编码对照表以及编码解码工具

三、Unicode编码

        统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。

        Unicode 源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。

        它从 0 开始,为每个符号指定一个编号,这叫做”码点”(code point)。比如,码点 0 的符号就是 null(表示所有二进制位都是 0)。

  👉在线 Unicode 编码转换

四、HTML实体编码

为什么有HTML实体编码        

        在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。

  • HTML 实体是一段以连字号 (&)开头、以分号 (;)结尾的文本 (字符串),形如 &#x6a; 
  • 实体常常用于显示保留字符 (这些字符会被解析为 HTML 代码)和不可见的字符 (如“不换行空格”)
  • 应用场景:在前端,一般为了避免 XSS 攻击,会将 <> 编码为 < 与 >,这些就是 HTML 实体编码
  • 使用须知:在 HTML 转义时,仅仅只需要对六个字符进行编码:&、<、>、"、' 和 `。 我们可以使用 he 库进行编码及转义

  👉 在线Html实体编码解码 (config.net.cn)

结合编码理解浏览器解析机制

①<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>
分析:a标签中的href属性放的是url,然后现在里面全是url编码,URL模块解码出来就是javascript:alert(1),因为是url解码后才能看到javascript所以最后没识别到这个协议,即alert没被执行
结果:执行失败


 ②<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">
分析:先通过HTML解码得到javascript:%61%6c%65%72%74%28%32%29,再丢给URL模块,URL模块识别到Javascript协议,把:后边的内容解码后丢给js的模块去处理
结果:执行成功


 ③<a href="javascript%3aalert(3)"></a>
分析:和①类似,URL识别到完整的javascript:后才能识别出这个协议
结果:执行失败


 ④<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>
分析:&#60是< ,&#62是> HTML实体编码把这俩转化成尖括号后token就被消耗掉了所以并不会进入到标签开始状态,自然<img>里面的内容也失效了
结果:执行失败


 ⑤<textarea>&#60;script&#62;alert(5)&#60;/script&#62;</textarea>
分析:这个看起来和④差不多,但其实<textarea>与<title>都是RCDATA元素,即在这俩标签里面,不可能有别的标签存在,所以最后也会把<>变成实体编码
结果:执行失败


 ⑥<textarea><script>alert(6)</script></textarea>
分析:这里与⑤做对照,就算<>不用html实体编码,最后也不会识别到<script>标签
结果:执行失败


 ⑦<button οnclick="confirm('7&#39;);">Button</button>
分析:html实体解码后得到'7'然后有js的函数confirm就会丢给js模块去处理
结果:执行成功


 ⑧<button οnclick="confirm('8\u0027);">Button</button>
分析:confirm函数里面用了unicode编码,没别的编码了,所以会解析过后会丢给js模块去处理,但是unicode只能用来表示字符串和标识符,所以最后右边的'没有解析成功
结果:执行失败


  ⑨<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
分析:html实体解析完后<script>中间的内容是alert(1)乍一看应该能执行,但是<script>是原始文本元素,只能放文本内容,在这里的话里面的东西html不会解析,会直接以文本格式丢给js模块去处理,js不认识html实体编码
结果:执行失败


 ⑩<script>\u0061\u006c\u0065\u0072\u0074(10);</script>
分析:<script>原始文本元素,丢给js模块去处理,解析出来的alert函数是个标识符,直接就执行了
结果:执行成功


 ⑪<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>
分析:类似于⑧,虽然看起来能解析出个alert(10)但是()不在标识符范围内,js解析执行失败
结果:执行失败


 ⑫<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
分析:与⑪做比较,js模块解析出来alert(12)看起来没什么问题,但是这里12是两个unicode编码,意思就是字符串,字符串是必须要''才能执行的
结果:执行失败


 ⑬<script>alert('14\u000a')</script>
分析:\u000a解码后就是换行,解码出来直接执行
结果:执行成功


 ⑭<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></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>
再进行URL解码得到👇
javascript:\u0061\u006c\u0065\u0072\u0074(15)
因为被URL模块识别到js协议了,所以丢给js模块解码
javascript:alert(15)
结果:执行成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QString和QByteArray的区别

QString和QByteArray的区别 本质格式转换QString字符串格式化打印长度 本质 QString是对QByteArray的再次封装 QString可以通过char*来构造&#xff0c;也可以通过QByteArray来构造 QByteArray就是char* QString是编码后的char* QString也是封装了字符串, 但是内部的编码为utf…

Linux笔记——搜索命令find、解压缩命令、vi编辑器、用户权限命令、系统信息相关命令讲解

系列文章目录 Linux笔记——磁盘进行分区与挂载介绍 Linux笔记——管道相关命令以及shell编程 Linux笔记——进程管理与网络监控技术讲解​​​​​​ Linux笔记——rpm与yum下载软件命令介绍 文章目录 系列文章目录 准备工作 一 搜索命令—— find 搜索 1.1 目标 1.…

【UE5 多人联机教程】04-加入游戏

效果 步骤 1. 新建一个控件蓝图&#xff0c;父类为“USC_Button_Standard” 控件蓝图命名为“UMG_Item_Room”&#xff0c;用于表示每一个搜索到的房间的界面 打开“UMG_Item_Room”&#xff0c;在图表中新建一个变量&#xff0c;命名为“Session” 变量类型为“蓝图会话结果…

Matlab 点云曲面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 2.1基于k个邻近点 SurfaceVar.m %% *******</

零信任网络架构与实现技术的研究与思考

目前&#xff0c;国外已有较多有关零信任网络的研究与实践&#xff0c;包括谷歌的 BeyondCorp、BeyondProd&#xff0c;软件定义边界&#xff08;Software Defined Perimeter&#xff0c;SDP&#xff09; 及盖特提出的“持续自适应风险与信任评估”等。国内也有不少安全厂商积极…

Unity 性能优化一:性能标准、常用工具

性能标准 推荐耗时&#xff1a; 性能提现到玩家直观感受&#xff0c;就是帧率&#xff0c;为了达到要求的帧率&#xff0c;就要控制CPU的耗时&#xff0c;不同类型的游戏&#xff0c;对帧率要求不一样。下面是推荐耗时&#xff1a; 推荐内存&#xff1a; 避免游戏闪退的重点…

network failed to load response data: no resource with given ide...

Chrome 开发者工具无法显示服务器正常返回的 HTTP 请求 - Failed to load response data 今天做开发时遇到一个问题&#xff0c;Chrome 开发者工具 network 标签里&#xff0c;虽然一个 HTTP 请求已经成功从服务器端返回&#xff0c;但是 Chrome 开发者工具里&#xff0c;仍然…

Cisco学习笔记(CCNA)——Open Shortest Path First (OSPF)

Open Shortest Path First (OSPF) 动态路由协议介绍 动态路由协议&#xff1a; 向路由表中添加远程网络 探索网络 更新和维护路由表 自主网络探索&#xff1a; 通过共享路由表信息路由器能探索到新的网络 动态路由协议的分类 内部网关协议&#xff08;IGP&#xff09; 适…

华为数通HCIP-ISIS高级

isis区域间的互访 1、L2区域 to L1区域 在L1区域发布的路由会以L1-LSP在L1区域内传递&#xff0c;到达L1-2路由器时&#xff0c;L1-2路由器会将该L1-LSP转换为L2-LSP在L2区域内传递&#xff1b; 因此L2区域的设备可以学习到L1区域的明细路由&#xff0c;进行访问&#xff1b;…

通过 API 远程管理 Jenkins

目录 前言&#xff1a; 背景介绍 Jenkins Remote API 的简介 Jenkins Remote API 的调用 Read More ... 前言&#xff1a; Jenkins 是一种开源的持续集成工具&#xff0c;可以帮助我们更加方便地进行软件开发和测试工作。通过 API 远程管理 Jenkins 可以帮助我们更加方便…

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2023)

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2023) Windows 11, version 22H2 官方原版&#xff0c;2023 年 7 月 更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作…

(三)RabbitMQ七种模式介绍与代码演示

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 七种模式介绍与代码演示 文章目录 七种模式介绍与代码演示四大交换机四种交换机介绍 工作模式简单模式&#xff08;Hello World&#xff09;工作队列模式&#xff08;Work queues&#xff09;订阅模式&#xff08;Publis…

Qt 类似vscode和matlab的分屏显示效果

运行截图 向右分屏 多分屏 全屏显示 介绍 实现了一个类似vscode和matlab的标签页显示分屏效果&#xff0c;支持鼠标拖拽分屏、全屏显示&#xff0c;可自适应调整大小&#xff0c;程序把要显示的Widget独立出来&#xff0c;可随时替换为其他的用户自定义Widget&#xff0c…

挂载文件系统

文章目录 注册文件系统类型挂载文件系统系统调用mount绑定挂载挂载命名空间1.标准的挂载命名空间2.共享子树&#xff08;1&#xff09;共享挂载&#xff08;2&#xff09;从属挂载&#xff08;3&#xff09;私有挂载&#xff08;4&#xff09;不可绑定挂载 挂载跟文件系统1.根文…

YOLOv5改进RepViT结构:清华 ICCV 2023,原创Bottleneck设计

RepViT: Revisiting Mobile CNN From ViT Perspective 论文方法从块设计改进YOLOv5结构核心代码1核心代码2核心代码3yaml1yaml2yaml3论文:https://arxiv.org/pdf/2307.09283.pdf   代码:https://github.com/THU-MIG/RepViT 最近,轻量级视觉 Trans

Android App 持续集成性能测试:启动流量

目录 前言&#xff1a; get app UID 获取流量数据 获得启动流量数据 总结 前言&#xff1a; Jenkins 是一种开源的持续集成工具&#xff0c;可以帮助我们更加方便地进行软件开发和测试工作。通过 API 远程管理 Jenkins 可以帮助我们更加方便地进行 Jenkins 的配置和管理工…

临时文档3

值传递 当一个对象被当作参数传递到一个方法后&#xff0c;此方法可改变这个对象的属性&#xff0c;并可返回变化后的结果&#xff0c;那么这里到底是值传递还是引用传递 是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时&…

什么是Java中的JVM(Java虚拟机)?

JVM&#xff08;Java虚拟机&#xff09;是Java平台的核心组件之一&#xff0c;是一个用于执行Java字节码的虚拟计算机。Java源代码经过编译器编译&#xff0c;生成字节码文件&#xff08;.class文件&#xff09;&#xff0c;然后由JVM来解释和执行这些字节码。JVM负责将字节码翻…

比较6组迭代次数的大小顺序

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A&#xff0c;B中各有5个点&#xff0c;并且让这10个点的位置没有重合。比较迭代次数。 其中有6组数据 差值结构 A-B 迭代次数 差值结构 构造平均…

tabs-pane锚点

目录 隐藏滚动条 锚点 <div class"right-wrap"><mds-tabs position"right" v-model"active" change"scroll(active, $event)"><mds-tabs-pane v-for"i in moduleNames" :key"i.val" :tab"i…