MD5 绕过第一式:弱比较绕过
文章目录
- 参考
- 环境
- MD5
- 韧性
- 脆弱性
- md5()
- 隐式类型转换
- 字符串连接
- 数学运算
- 布尔判断
- 相等运算符
- 科学计数法
- 科学计数法
- 前缀 0E 与 0e
- PHP8 与 PHP 其他版本下字符串转化为数值的具体规则
- PHP8
- 数值字符串
- 优化
- 其他版本
- 更为详细的讲解
- 字符串与字符串的弱比较
- 字符串与数值的弱比较
- 0e215962017
参考
项目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
PHP 手册 | PHP Manual |
wsfgrdgh | PHP8中字符串与数字的比较更智能 |
PHP RFC 文档 | Saner string to number comparisons |
环境
项目 | 描述 |
---|---|
PHP | 5.5.0 、5.6.8 、7.0.0 、7.2.5 、7.4.9 、8.0.0 、8.2.9 |
MD5
MD5(Message Digest Algorithm 5)
是一种常用的哈希函数算法,用于将 任意长度
的数据转换为 固定长度
的哈希值。MD5
是 MD4
算法的改进版本,由 Ronald Rivest
在 1992
年设计并广泛使用。
MD5 算法的 输出结果
是一个 128
位,即长度为 16
字节的哈希值,通常表示为一个 32 位
的 十六进制数
。
韧性
-
不可逆性
MD5 是一种单向哈希函数
,具有不可逆性的特性。这意味着无法
通过已知的 MD5 哈希值
来准确地确定原始输入数据
。 -
雪崩效应
MD5 的雪崩效应是指对输入数据微小改变
会导致输出哈希值发生巨大变化
的特性。具体来说,即使输入数据只有一个比特位的改变,其计算得到的 MD5 哈希值也会产生全局性的变化
,而不仅仅在修改的位置上体现出差异。 -
唯一性
理想情况下
,对于不同的输入数据,MD5 算法生成的哈希值应该是唯一的。也就是说
,不同的输入数据应该产生不同的哈希值。 -
快速性
MD5 是一种快速计算哈希值的算法,适用于对大量数据进行哈希计算
的场景。
脆弱性
MD5 算法的 哈希输出空间
相对较小,仅有 128
位(仅能容纳 128 位二进制数据),而 输入空间是无限的
,这种 输入与输出的不匹配性
导致了哈希碰撞的 可能性
。攻击者可以使用 巧妙构造的输入数据
,通过精心选择的 碰撞攻击算法
,找到 具有相同哈希值的不同输入
。
-
碰撞攻击
由于 MD5 的设计特点
和算法结构
,使得攻击者能够使用巧妙构造的输入数据来找到碰撞。碰撞攻击的发现使得 MD5 不再适用于对数据完整性和身份验证进行可靠保护。 -
预计算攻击
由于 MD5 的计算速度较快
,攻击者可以预先计算常见输入数据的 MD5 哈希值并将其存储在哈希表中
。这样,在实际攻击过程中,攻击者可以通过将需要进行破解的哈希值与预先计算的哈希值进行比对
来实现对哈希值的快速破解。
md5()
在 PHP 中,md5()
函数用于计算给定字符串的 MD5 哈希值
,该函数采用一个字符串作为输入并返回其 对应的哈希值
。
md5(string $string, bool $binary = false): string
其中:
项目 | 描述 |
---|---|
$string | 要计算 MD5 哈希值的字符串。 |
$binary | 参数值为一个 布尔类型 的数据,用于指定返回的哈希值是 二进制格式 还是 十六进制格式 。默认为 false ,表示返回 十六进制格式 的哈希值,如果设置为 true ,则返回 二进制格式 的哈希值。 |
举个栗子
<?php// 尝试将字符串 Hello World 转换为 MD5 哈希值
var_dump(md5('Hello World'));// 尝试将字符串 12 转换为 MD5 哈希值
var_dump(md5('12'));// 当函数 md5() 的输入值为数值时将自动将非数值数据转换为数值数据
var_dump(md5(12));
执行效果
string(32) "b10a8db164e0754105b7a99be72e3fe5"
string(32) "c20ad4d76fe97759aa27a0c99bff6710"
string(32) "c20ad4d76fe97759aa27a0c99bff6710"
注:
md5
函数的 $binary
参数的值设置为 true
,此时若将转换结果输出至终端中将出现 乱码
的现象。这是因为 PHP 会 自动尝试
将 二进制数据
转换为 可以显示的文本信息
。PHP 会将二进制数据中的 每一个字节
转化为对应的 ASCII 字符
,而转化结果中包含了 部分不可打印字符(回车符、空字符等)
,这些不可见字符将以 乱码
的形式展现。其中,回车符
虽然为 不可见字符
,但在文本中起着将文本内容换行的作用。对此,请参考如下示例:
<?php// 尝试将哈希值以二进制方式输出至终端中
var_dump(md5('Hello World', true));// 尝试将哈希值的二进制表达转换为十六进制后输出至终端中
var_dump(bin2hex(md5('Hello World', true)));
执行效果
由于二进制数据转化为文本的结果中包含不可见字符 换行符
,所以 var_dump(md5('Hello World', true));
的输出结果中以 两行
的形式呈现。
string(16) "�
��d�uA����.?�"
string(32) "b10a8db164e0754105b7a99be72e3fe5"
隐式类型转换
在 PHP 中,隐式类型转换(Implicit Type Conversion)
是指在某些操作中,PHP 会 自动
将数据 由一种数据类型转换为另一个数据类型
,而 无需显式
地编写 类型转换
代码。
PHP 的隐式类型转换会按照一定规则(具体情况具体分析)对操作数进行转换,以使得相关操作 能够正常进行
下去。
字符串连接
在通过使用句点运算符 .
进行字符串连接操作时,PHP 将会尝试将其他数据类型 转换为字符串数据类型
。对此,请参考如下示例:
<?php// 尝试将两个字符串进行拼接
var_dump('Hello ' . 'World');// 尝试将数值与字符串进行拼接
var_dump('1 + 1 = ' . 2);// 尝试将两个数值进行拼接
var_dump(1 . 1);
执行效果
string(11) "Hello World"
string(9) "1 + 1 = 2"
string(2) "11"
数学运算
在通过 数学运算符
进行数学运算时,PHP 将会尝试将其他数据类型的数据 转换为数值类型
。对此,请参考如下示例:
<?php// 尝试对布尔值 true 与数值 1 进行减法运算
var_dump(true - 1);// 尝试对布尔值 true 与 false 进行加法运算
var_dump(true + false);// 尝试进行字符串之间的乘法运算
var_dump('2' * '150');// 字符串 100djdj 将被转换为 100
var_dump('100djdj' / 10);// 字符串 djdj100 将被转换为零
var_dump('djdj100' / 10);
执行效果
int(0)
int(1)
int(300)
int(10)
int(0)
布尔判断
在需要使用布尔值的位置,PHP 将尝试将非布尔值的数据 转换为布尔类型的数据
。对此,请参考如下示例:
<?php// 尝试将空字符串转换为布尔值
if(''){print('Hello World' . "\n");
}// 尝试将字符串 Hello World 转换为布尔值
if('Hello World'){print('Hello China' . "\n");
}// 尝试将数值 999 转换为布尔值
if(999){print('久久久' . "\n");
}
执行效果
Hello China
久久久
相等运算符
在 PHP 中存在两种相等运算符,即弱类型相等运算符 ==
和强类型相等运算符 ===
,两者都可以用于判断两个操作数是否相等,但存在一些区别。
两者的 区别
在于,弱类型相等运算符
在对操作数进行比较之前,将 自动
进行类型转换以 使两者所属的数据类型相同
。而 强类型相等运算符
在进行比较时,要求两个值的 类型
和 值
都必须 完全相同
,不进行类型转换
。对此,请参考如下示例:
<?php// 在通过弱类型比较运算符对数值与字符串进
// 行比较时,PHP 优先将字符串转换为数值。// 由于两者转换为同一类型后,值相同,
// 故将返回 true。
var_dump('123' == 123);// 由于两者的数据类型及值均不相同,故
// 将返沪 false。
var_dump('123' === 123);
执行效果
bool(true)
bool(false)
科学计数法
科学计数法
在 PHP 中,e
与 E
均表示 科学计数法(Scientific Notation)
。科学计数法由 基数
和 指数
两部分组成,常用于
表示非常大或非常小的数值。
在科学计数法中,基数 通常
是一个浮点数,介于 1
到 10
之间,而指数是一个整数,表示要将基数乘以 10
的多少次方。基数与指数之间以字符 e
或 E
进行分隔。
举个栗子
<?php// 3.78 * 10 ^ 3
var_dump(3.78e3);// 3 * 10 ^ -1
var_dump(3E-1);
执行效果
float(3780)
float(0.3)
前缀 0E 与 0e
零的任何指数次幂都为零
,因此以 0E
或 0e
为前缀的科学计数法表示的数值的结果都将为数值零。对此,请参考如下示例:
<?phpvar_dump(0e3280);
var_dump((float)'0e30284083');
var_dump((float)'0esjlfjsld');
执行效果
float(0)
float(0)
float(0)
PHP8 与 PHP 其他版本下字符串转化为数值的具体规则
PHP8
数值字符串
数值字符串
是指一个包含数字字符的字符串,数值字符串可以用于直接表示一个数值。
举个栗子
"123"
"-42"
"+384""3.14"
"-0.5"
"0.0000"
"00000000.0000""2.5e3"
"1.2e-2"
"+42.0E0""0004746"
"0305940"
" 484748 "
" 4847 "
" 3847"
注:
- 包含
代表其他进制(非十进制)数值的符号
的字符串不能被称为数值字符串(数学中通常不使用这些符号来标识其他进制的数值
),如0x1F
、0b10101
等字符串。在 PHP 中,八进制数值
通过前导零
来表示,但在数值字符串中
,前导零将被视为普通数字,不具备标识八进制数值的功能
。 - 如果存在将其他进制(非十进制)的字符串转化为数值的需求,可以考虑使用
intval()
等函数进行显式类型转化。 包含空格等空白字符的字符串
为什么也可以是数值字符串?你可以理解为一眼望去是数值的就是数值字符串
😔。
优化
PHP8 仍旧保留了隐式类型转换
这一特性,但在字符串与数值的弱比较方面做出了优化。在 字符串与数值的弱比较
过程中,PHP 将 依据字符串的不同
选择 将字符串转换为数值
或 将数值转换为字符串
后再进行比较。具体规则如下:
- 若字符串
符合数值字符串的定义
,则 PHP 尝试将字符串转化为数值
后再进行比较。 - 若字符串
不符合数值字符串的定义
,则 PHP 尝试将数值转化为字符串
后再进行比较。
其他版本
在 PHP 的 隐式类型转换过程
中,字符串转化为数值的具体规则如下:
- 若字符串的
首个字符不为数字且不为空格等空白字符
,则将该字符串转化为零。 - 若字符串的
首个字符不为数字但为空格等空白字符
,则尝试读取其余字符,将遇到数字前的所有空白字符均转化为零,将遇到数字后的所有空白字符视为非数字字符;在遇到非数字字符时停止对字符串的读取并将已读取字符转化为数值
。 - 若字符串的
首个字符为数字
,则尝试读取其余字符,在遇到非数字字符(除符合科学计数法格式的字符 e 或 E外)时停止对字符串的读取并将已读取字符转化为数值
。
举个栗子
目标字符串 | 转化结果 |
---|---|
Hello123 | 0 |
1Hell2o3 | 1 |
0x8aHello123 | 0 |
9.384Hello | 9.384 |
0008743738Hello948 | 8743738 |
1.223e100 | 122.3 |
注:
PHP 在执行字符串到数值的隐式类型转换过程,均 以十进制表示法
为依据。同上述例子一般,0x8aHello123
中的 0x8a
并不会被识别为十六进制数,由于十进制中不存在 x
,故 PHP 在识别到字符 x
时就将立即停止读取并将读取到的字符串 0
转化为数值,故最终的转化结果为零。
更为详细的讲解
如果对 PHP8 与 PHP 其他版本下字符串转化为数值的规则希望能有更为详细的讲解,可以参考我的另一篇博客 PHP 变动:PHP 8 版本下字符串与数值的弱比较。
字符串与字符串的弱比较
在 PHP 中,若弱比较运算符的两个操作数 均为字符串
。PHP 将 依据不同 PHP 版本下字符串转化为数值的规则
将两个操作数转化为数值。
在 MD5 的绕过过程中,常常使用 MD5 加密结果符合如下格式
的字符串:
前缀为 `0e` 或 `0E` (后续格式说明仅针对 PHP 8 及以上版本)且后续字符均为数字的字符串。
而 byGcY
和 0e215962017
就是符合这一规则的字符串。
攻击目标中若存在 包含 MD5 解密的弱比较环节
,我们便可以使用这么一些字符串尝试 使得判断结果朝符合我们的预期
。
举个栗子
<?php# 变量 $user_input 中存放着用户的输入
$user_input = '0e215962017';# != 为弱类型不等运算符,强类型不等运算符为 !==
if (md5('byGcY') != md5($user_input)) {print("Come to my city" . "\n");
} elseif ("Hack Me" == md5($user_input)) {print("Be my king" . "\n");
} else {print("Look at my invincible defense" . "\n");
}# byGcY 与 0e215962017 的 MD5
# 加密结果均以 0e 为前缀,且 md5() 函数的返回
# 结果的数据类型为字符串,故将发生字符串到数值的
# 隐式类型转化。
var_dump(md5('byGcY'));
var_dump(md5($user_input));
执行效果
Look at my invincible defense
string(32) "0e591948146966052067035298880982"
string(32) "0e291242476940776845150308577824"
注:
在 PHP 中,若弱类型比较运算符的操作数 均为字符串
,当且仅当字符串操作数在当前 PHP 版本中均能够转化为数值时
,PHP 才会将其转化为数值进行比较。否则,按照字符串的比较规则进行比较。
字符串与数值的弱比较
在 PHP 中,若弱比较运算符的两个操作数分别为 数值
与 字符串
。PHP 将 依据不同 PHP 版本的转化规则
将两个操作数中的一个转化为另一种数据类型。
同 字符串与字符串的弱比较一般
,当攻击目标中存在 包含 MD5 解密的弱比较环节
,可以通过构造字符串利用弱比较规则 使得判断结果朝符合我们的预期
。
举个栗子
<?php$user_input = '0e215962017';
$hello = 'Hello WOrld';if (0.000 != md5($user_input)) {print("Come to my city" . "\n");
} elseif (68 == md5($hello)) {print("Be my king" . "\n");
} else {print("Look at my invincible defense" . "\n");
}# 由于 $hello 中的 MD5 加密结果以数字 68 开头,在
# PHP8 以下版本中,该字符串将被转化为数值 68。
var_dump(md5($hello));
执行效果
上述示例在 PHP8 以下版本
中的运行结果为:
Be my king
string(32) "68c131c6982a0bbbbae667624d8eca7d"
上述示例在 PHP8 版本
中的运行结果为:
Look at my invincible defense
string(32) "68c131c6982a0bbbbae667624d8eca7d"
0e215962017
0e215962017
这个字符串比较特殊,因为 该字符串及该字符串的 MD5 加密结果均以 0e
为前缀。在参加有关 MD5 绕过的安全竞赛时,你可能将遇到与如下类似的题目:
<?php$user_input = '0e215962017';if ($user_input == md5($user_input)) {print("Come to my city,Be my king" . "\n");
} else {print("Look at my invincible defense" . "\n");
}var_dump(md5($user_input));
执行结果
Come to my city,Be my king
string(32) "0e291242476940776845150308577824"
相关文章:

MD5 绕过第一式:弱比较绕过
文章目录 参考环境MD5韧性脆弱性md5() 隐式类型转换字符串连接数学运算布尔判断相等运算符 科学计数法科学计数法前缀 0E 与 0e PHP8 与 PHP 其他版本下字符串转化为数值的具体规则PHP8数值字符串优化 其他版本更为详细的讲解 字符串与字符串的弱比较字符串与数值的弱比较0e215…...

红黑树是如何实现的?
文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …...
实验室没人导该怎么办
实验室没人教该怎么办 Q: 国内top5高校研一,课题开始老板就给了一个大方向,之后怎么做实验都是自己看文献研究的,终于开始动手做实验,才发现别人根本不想管你,宁愿抱着电脑看剧也不想教你,十分焦虑,该怎么办? A: 按照大多数实验室的惯例,老板一定会指派一个小老板…...

pytest简明教程
1. 简介 pytest是一款基于Python的测试框架。与Python自带的unittest相比,pytes语法更加简洁,断言更加强大,并且在自动测试以及插件生态上比unittest都要更加强大。 1.1. 安装pytest pip install pytest1.2. pytest命名规则 pytest默认会…...
解决方案:解决https页面加载http资源报错
HTTPS页面加载HTTP资源会报错的原因是出于安全性考虑。 HTTPS(HyperText Transfer Protocol Secure)是一种通过使用SSL/TLS加密通信来保护数据传输的协议,它确保了客户端和服务器之间的安全连接。 当HTTPS页面尝试加载非加密的HTTP资源时&a…...

嵌入式开源库之libmodbus学习笔记
socat 安装sudo apt-get install socat创建终端 socat -d -d pty,b115200 pty,b115200查看终端 ls /dev/pts/ minicom 安装 sudo apt-get install minicom链接虚拟终端 sudo minicom -D /dev/pts/3以十六进制显示 minicom -D /dev/pts/1 -H设置波特率 minicom -D /dev/pts/1…...
Spring MVC 中的数据验证技术
一、前言 在Web开发中,数据验证是不可或缺的一部分。Spring MVC 框架提供了强大的数据验证支持,可以帮助我们轻松地对用户提交的数据进行验证。 二、实现 Spring MVC 使用 JSR-303 验证规范(Hibernate Validator 是其参考实现)…...

windows 修改hosts映射,可以ping通,但是无法通过http url 路径访问,出现 500 Internal Privoxy Error
问题描述 今天在学习nginx时,想在hosts配置一个nginx的域名映射,但是发现访问nginx服务的ip时可以访问通,在dos命令窗口ping配置的域名映射也可以ping通,但是一旦在浏览器通过http请求访问配置的hosts域名映射时却出现 500 Inter…...

如何将图片转为ico格式
这里主要是记录一个网站,如果你有更好的办法欢迎留言~ ico简介 ICO(Icon)是一种用于表示图标的文件格式,常用于Windows操作系统中。ICO格式的图片通常用于表示应用程序、文件夹、网站等的图标。 ICO文件可以包含多个图标&#x…...

ElasticSearch - 基于 JavaRestClient 操作索引库和文档
目录 一、RestClient操作索引库 1.1、RestClient是什么? 1.2、JavaRestClient 实现创建、删除索引库 1.2.1、前言 1.2.1、初始化 JavaRestClient 1.2.2、创建索引库 1.2.3、判断索引库是否存在 1.2.4、删除索引库 1.3、JavaRestClient 实现文档的 CRUD 1.3…...
【人脸质量评估】MagFace:一个既可以用作人脸识别,又可以用作人脸质量评估的方法
论文题目:《MagFace: A Universal Representation for Face Recognition and Quality Assessment》-CVPR2021 论文地址:https://arxiv.org/abs/2103.06627v4 代码地址:https://github.com/IrvingMeng/MagFace...

FPGA 图像缩放 千兆网 UDP 网络视频传输,基于RTL8211 PHY实现,提供工程和QT上位机源码加技术支持
目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…...

智能驾驶、智能家居、智能工业中的 AI 关键基础设施,半导体厂商恩智浦的角色是什么?
我们来看一条七年前的真实新闻报道,2016 年《福布斯》在报道中提到“2020 年会有 1000 万台的自动驾驶汽车”。然而 2023 年的现在,真正实现 L4 级别自动驾驶的汽车,仍然远远没有达到这个预测的数量。 另一边,数据显示,…...
APScheduler包——python tornado框架中实现定时任务
介绍: APScheduler的全称是Advanced Python Scheduler。它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时…...

BASH shell脚本篇3——字符串处理
这篇文章介绍下BASH shell中的字符串处理的相关命令。之前有介绍过shell的其它命令,请参考: BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 Bash字符串也是一种数据类型,它用于表示文本而不是数字,它是一组可能…...

【SSL】用Certbot生成免费HTTPS证书
1. 实验背景 服务器:CentOS7.x 示例域名: www.example.com 域名对应的web站点目录: /usr/local/openresty/nginx/html 2. 安装docker # yum -y install yum-utils# yum-config-manager --add-repo https://download.docker.com/linux/ce…...
报错:java.sql.SQLSyntaxErrorException: Table ‘examsys.Teacher’ doesn’t exist
Linux大小写区分,导致部署项目时MySQL出现错误 问题原因:找不到Teacher这张表。因为在windows下的mysql表名不区分大小写,所以在windows下运行项目没问题。在linux中,mysql会区分大小写,所以sql语句表名用大写的就会找…...
.NET的PLC帮助类
TCP和UDP协议: TCP(传输控制协议)和UDP(用户数据报协议)是TCP/IP协议簇中的两种核心协议。它们在传输层上提供数据传输服务,但具有不同的特性和功能。 TCP协议是一种提供可靠、面向连接的字节流服务的传输协…...
Linux中nfs:failed: Operation not supported
先给出思路: 一个简单粗暴的方式:卸载重装排除未知问题,步骤如下: 一、在 Linux 上卸载 NFS 服务器,步骤: 停止 NFS 服务: sudo service nfs-kernel-server stop如果您使用的是不同的发行版&am…...

ElasticSearch映射与模板介绍
一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用,ES现在已升级到8.5版本,有些概念和SDK用法都有很大变化,后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...