CTFCryto01-URL编码

URL编码

  • URL编码,也称为百分号编码,是一种用于在URL(统一资源定位符)中传输特殊字符的编码方式
  • 当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符
  • 安全字符:指的是没有特殊用途或者特殊意义的字符

应用场景

  • 浏览器地址栏:用户在输入含有特殊字符的URL时,浏览器会自动进行URL编码
  • 表单数据提交:通过GET或POST方法提交表单时,数据中的特殊字符会被编码,以确保传输的正确性
  • API请求:在RESTful API中,URL编码用于传递参数,确保参数值中包含的特殊字符不会破坏URL结构
  • 文件传输:在文件名中包含特殊字符时,URL编码用于正确传输文件路径。

URL结构分解

  • URL 中规定了一些具有特殊意义的字符,常被用来分隔两个不同的 URL 组件,这些字符被称为保留字符
    • 冒号:用于分隔协议和主机组件,斜杠用于分隔主机和路径
    • ?:用于分隔路径和查询参数等
    • =:用于表示查询参数中的键值对
    • &:用于分隔查询多个键值对
    • 其余常用的保留字符有:/ . … # @ $ + ; %
  • http://example.com:8080/path/to/index.php?param1=value1&param2=value2#section
    • 协议:http://(或https://)
    • 域名:example.com
    • 端口::8080(默认HTTP端口80、HTTPS端口443可省略)
    • 路径:/path/to/index.php(服务器上的文件路径)
    • 查询参数(查询字符串):?param1=value1&param2=value2
      • 路径和查询字符串之间使用问号?隔开
    • 片段标识:#section(页面内锚点)

编码原理

  • 使用百分号(%)后跟随两个十六进制数字来表示该字符的ASCII码。通过这种方式,任何字符都可以被安全地包含在URL中

编码规则

  • 保留字符编码:将所有保留字符转换为其ASCII码对应的百分号编码。例如,空格( )的ASCII码是32,对应的十六进制是20,因此空格在URL中表示为%20
  • 非ASCII字符编码:对于URL中包含的非ASCII字符(如中文字符),首先将其转换为UTF-8编码的字节序列,然后将每个字节转换为百分号编码。例如,中文字符“你”的UTF-8编码为E4 BD A0,对应的URL编码为%E4%BD%A0
  • 非保留字符不编码:非保留字符可以直接使用,不需要进行编码

哪些字符需要编码

  • URL 之所以需要编码,是因为 URL 中的某些字符会引起歧义,比如 URL 查询参数中包含了”&”或者”%”就会造成服务器解析错误
  • URL 的编码格式采用的是 ASCII 码而非 Unicode 格式,这表明 URL 中不允许包含任何非 ASCII 字符(比如中文),否则就会造成 URL 解析错误。
  • URL 编码协议规定(RFC3986 协议):URL 中只允许使用 ASCII 字符集可以显示的字符(安全字符/非保留字符)
    • 英文字母、数字、和- _ . ~这 6 个特殊字符
    • 当在 URL 中使用不属于 ASCII 字符集的字符时,就要使用特殊的符号对该字符进行编码,比如空格需要用%20来表示
  • 除了无法显示的字符需要编码外,还需要对 URL 中的部分保留字符和不安全字符进行编码
    • 示例:!, *, ', (, ), ;, :, @, &, =, +, $, ,, /, ?, #, [, ], <, >, ", ", {, }, |, , ^等

URL特殊字符编码

字符 含义 十六进制值编码
+ URL 中 + 号表示空格 %2B
空格 URL中的空格可以编码为 + 号或者 %20 %20
/ 分隔目录和子目录 %2F
? 分隔实际的 URL 和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D

Python实现编码与解码

  • Python 的标准库urllib.parse模块中提供了用来编码和解码的方法,分别是 urlencode() 与 unquote() 方法。
    • urlencode():该方法实现了对 url 地址的编码操作
    • quote():该方法实现了对 url 地址的编码操作
    • unquote():该方法将编码后的 url 地址进行还原,被称为解码
    • 注意:quote() 只能对字符串编码,而 urlencode() 可以直接对查询字符串字典进行编码
#导入parse模块
from urllib import parse
#构建查询字符串字典
query_string = {
'wd' : '爬虫'
}
#调用parse模块的urlencode()进行编码
result = parse.urlencode(query_string)
#使用format函数格式化字符串,拼接url地址
url = 'http://www.baidu.com/s?{}'.format(result)
print(url)#注意url的书写格式,和 urlencode存在不同
url = 'http://www.baidu.com/s?wd={}'
word = input('请输入要搜索的内容:')
#quote()只能对字符串进行编码
query_string = parse.quote(word)
print(url.format(query_string))urllib.parse.urlencode({'key':'value'}) #字典
urllib.parse.quote(string) #字符串string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result)

URL解码

浏览器解码逻辑详解

  • 自动解码的触发条件:
    • 仅对合法编码序列解码:若输入形如%XX(X为十六进制字符),浏览器会尝试解码。
    • 非编码字符保留原样:例如%zz(非法编码)会被直接发送。
  • 双重编码的递归解码:
    • 浏览器仅解码一次:不会递归解码多次。
    • 输入%2525 → 解码为%25,不会继续解码为%。
  • 安全字符的特殊处理
    • 部分浏览器优化:对某些安全字符(如字母)的编码可能自动解码
    • 输入%41 → 发送时可能直接转为A
  • 利用:
    • 绕过路径遍历过滤
    • XSS绕过关键字过滤

浏览器解码策略

浏览器 双重编码处理 安全字符编码处理
Chrome 解码一次(发送单层编码) 可能自动解码为明文
Firefox 解码一次(发送单层编码) 保留编码形式
Safari 同Chrome 同Chrome
Edge 同Chrome 同Chrome

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt基于QWidget打造网速小部件SpeedMeterWidget

目标基于QWidget自定义网速小部件 支持设置上行和下行方向 支持自定义设置网速显示数值和单位 支持动态设置上行和下行颜色效果图控件完整代码 SpeedMeterWidget.h #pragma once#include <QWidget> #include <QPainter> class QPaintEvent;/// /// @brief: 速度仪…

Qt基于QWidget实现倒计时控件CircleCountDownBar

目标基于Qwidget实现圆弧倒计时 可自定义圆弧内部显示的文字 可设定当前圆弧的进度效果图完整控件代码 CircleCountDownBar.h #pragma once#include <QWidget> class QPaiter; class QPaintEvent;class CircleCountDownBar : public QWidget {Q_OBJECTpublic:CircleCount…

初学者的量化 “利器”,哪种策略才是你的菜?

初学者量化投资别迷茫!中低频策略为何优选?快来解锁适合拟的量化“利器”策略更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 写在前面 这篇文章专为量化投资领域的小白精心打造,量化大神们请自动略过哦。 本文将从中低频交易方…

Qt实现速度仪表盘GaugeSpeedWidget

目标基于QWidget绘制速度仪表盘, 仪表盘颜色为渐变色, 可指定当前显示的文字内容和文字颜色 可指定当前指针旋转的数值效果图控件完整代码 GaugeSpeedWidget.h #pragma once#include <QWidget> #include <QMap>class QPaintEvent; class QPainter;/// /// @brie…

pcie报文

PCIE的四种请求memory、IO的地址编码posted、no-postedTLP包类型缩写MRD举例TLP包格式TLP HEADTLP HEAD byte0memory操作

P1107 [BJWC2008] 雷涛的小猫

链接 https://www.luogu.com.cn/problem/P1107 题目思路因为在取h+delta的max时会一直遍历,所以直接加个记忆,就不用一直遍历了。 代码 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<queue> #include<cmath> #in…

PVE8.3.1开启核显虚拟化SR-IOV

本来想集成到前面的文章,但是被网上一些文章误导从而浪费了3H之后决定还是单开一篇专门说说PVE8.3.1开启核显虚拟化的过程。所以建议大家还是参考更有价值的唯一的官方指南 https://github.com/strongtz/i915-sriov-dkms 交代一下背景: 发文日期2025年2月14日,以下所有操作均…

【C】单链表

单链表 声明一个指向自身的结构体 struct Test {int x;int y;struct Test test; };输出结果: error!程序报错,因为这样会造成无限的循环。当编译器解析到struct Test test时test是结构体Test的成员,定义test成员需要Test,而结构体Test自身又是不完整的,那么程序就无法定义一…

所有Ollama用户请注意!!!你的IP可能已泄露

刚刚学到一项非常硬核的“黑”科技,只要几个关键词,就能实现 Ollama 自由。全世界几万台高性能带显卡的电脑供你使用。 添加图片注释,不超过 140 字(可选)看看这个页面,美国,中国,德国,英国....一个独立 IP 背后就是一台电脑,有些可能还是服务器。我实测了,随便找一…

【C】内存布局

动态内存管理 动态内存管理的几个函数malloc -- 申请动态内存空间 free -- 释放动态内存空间 calloc -- 申请并初始化一系列内存空间 realloc -- 重新分配内存空间malloc函数原型:void *malloc(size_t size);malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块…

【C】指针

指针 变量在内存中的存放 在内存中,字节是最小的存储单元。对于一个内存单元来说,指针就是单元的地址,每个地址可以存放一个字节的数据。存放一个整形变量(int)就需要动用到四个存储单元。 在内存中完全没有存储变量名的必要。 因为编译器知道具体每一个变量名对应的存放地址…