0

0

PHP文件名替换怎么弄_替换时过滤非法字符办法【过滤】

絕刀狂花

絕刀狂花

发布时间:2026-01-14 15:52:02

|

490人浏览过

|

来源于php中文网

原创

php文件名替换前必须过滤、/、、:、*、?、"、、|等非法字符,其中会导致静默失败,/和会误判为路径分隔符,:在windows下为保留字符。

php文件名替换怎么弄_替换时过滤非法字符办法【过滤】

PHP 文件名替换前必须过滤哪些非法字符

Windows 和 Linux 对文件名的限制不同,但 PHP 在任意系统上写文件时,只要包含 (空字节)、/:*?"、<code>>| 就可能报错或被截断。尤其 会导致 fopen() 静默失败,/ 会误判为路径分隔符。

  • / 必须移除或替换,否则 file_put_contents('a/b.txt', ...) 会创建子目录而非重命名
  • : 在 Windows 下是保留字符(如 CON:),即使出现在中间也可能触发系统拒绝
  • 是最隐蔽的坑——用户从表单或数据库读出的字符串若含 NUL 字节,move_uploaded_file() 会失败但不报错

preg_replace() 安全清理文件名的写法

别用 str_replace() 逐个替换,它无法处理 Unicode 或组合字符;也别用 basename(),它只去路径不清理非法符。推荐正则一次性清除所有危险字符,并保留常见安全符号(字母、数字、下划线、短横、点)。

function sanitize_filename($name) {
    // 移除控制字符、空字节、路径分隔符、Windows 保留名字符
    $name = preg_replace('/[--]/', '', $name); // ASCII 控制符
    $name = preg_replace('/[\\/:*?"<>|]/', '_', $name); // 替换为下划线
    $name = preg_replace('/[^w.-]+/', '_', $name); // 其余非字母数字、点、短横、下划线全转 _
    $name = preg_replace('/_+/', '_', $name); // 合并连续下划线
    $name = trim($name, '_'); // 去首尾 _
    return $name ?: 'unnamed';
}

注意:w 在 PCRE 默认模式下匹配 ASCII 字母数字和下划线;如需支持中文等 Unicode 字符,得加 u 修饰符并改用 [p{L}p{N}.-],但需确认服务器 PCRE 版本 ≥ 8.32。

上传文件时重命名的典型流程(含扩展名保护)

用户传来的原始文件名不可信,不能直接拼接进 move_uploaded_file() 路径。要分离扩展名、清理基础名、再拼回,否则可能被绕过(比如传 shell.php.jpg,清理后变成 shell_php.jpg,但攻击者若传 xxx.php<p>用户传来的原始文件名不可信,不能直接拼接进 <code>move_uploaded_file() 路径。要分离扩展名、清理基础名、再拼回,否则可能被绕过(比如传 shell.php.jpg,清理后变成 shell_php.jpg,但攻击者若传 xxx.php.jpg,不清理 就会截断为 xxx.php)。

.jpg,不清理 <p>用户传来的原始文件名不可信,不能直接拼接进 <code>move_uploaded_file() 路径。要分离扩展名、清理基础名、再拼回,否则可能被绕过(比如传 shell.php.jpg,清理后变成 shell_php.jpg,但攻击者若传 xxx.php.jpg,不清理 就会截断为 xxx.php)。

就会截断为 xxx.php)。

DALL·E 2
DALL·E 2

OpenAI基于GPT-3模型开发的AI绘图生成工具,可以根据自然语言的描述创建逼真的图像和艺术。

下载

立即学习PHP免费学习笔记(深入)”;

  • pathinfo($original_name, PATHINFO_EXTENSION) 提取扩展名,不要用 substr(strrchr())
  • 对基础名(不含扩展)单独调用 sanitize_filename(),避免扩展名被误改(如把 .tar.gz 变成 .tar_gz
  • 拼接时显式加点:$safe_name . '.' . $ext,不要依赖原始字符串中的点
  • 最终检查扩展名是否在白名单中(如 ['jpg','png','pdf']),防止 sanitize_filename() 漏掉双扩展绕过

为什么 iconv()mb_convert_encoding() 不该用在文件名清理上

这两个函数用于编码转换,不是字符过滤。如果原始文件名含乱码(如 GBK 编码的 UTF-8 字符串),强行转码可能产生问号或异常字符,反而引入新非法符。真正该做的是:在接收文件名时就确保编码一致(如统一用 UTF-8 接收),然后只做“字符集无关”的符号清理。

更关键的是:PHP 的 file_*() 系列函数底层调用系统 API,而 Linux 文件系统本身不关心编码,只是把字节流当名字存;Windows 则依赖当前 ANSI 代码页。所以清理动作必须在字节层面操作,而非字符语义层面——这也是为什么正则里用 [-] 而不用 p{C}

扩展名截断、NUL 字节、路径分隔符这三类问题,漏掉任何一个都可能导致文件写入失败或目录穿越。实际部署时建议加日志记录清洗前后的文件名,方便排查前端传参异常。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1128

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1102

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

187

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

91

2025.08.07

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号