在处理文件上传或文件操作时,文件名的安全性和合法性非常重要。非法的文件名可能导致系统错误、安全漏洞甚至文件覆盖风险。本文介绍了一种基于 PHP 的自定义函数 mb_scrub,用于过滤和规范文件名字符串,尤其适合包含多字节字符的场景。
编码统一
为了正确处理多字节字符(如中文、日文、韩文等),首先使用 mb_convert_encoding 将输入字符串统一转成 UTF-8 编码,避免字符截断或乱码。
字符过滤
通过正则表达式,保留特定的合法字符集合。通常文件名允许的字符有:
英文字母(大小写)
数字
下划线 _
句点 .
连字符 -
这些字符既能满足大多数文件名需求,也避免了特殊字符带来的风险。
避免特殊开头
文件名以点开头通常表示隐藏文件或特殊系统文件。用 ltrim 去掉开头多余的点,确保不会无意中创建隐藏文件。
空字符串保护
如果过滤后文件名为空字符串,自动赋予一个默认文件名(如 default_filename),防止后续文件操作出错。
示例中输入文件名为 非法文件名<>:"/\|?*.txt,其中包含了许多非法字符。经过 mb_scrub 处理后,只剩下允许的字符,示例输出如下:
<span><span><span class="hljs-section">原始文件名:非法文件名<>:"/\|?*.txt</span></span><span>
过滤后文件名:txt
</span></span>
这里示例较为简单,实际项目中可以根据需求对允许字符集进行调整,或者结合额外规则(如限制长度、限制扩展名等)。
结合文件扩展名检查:过滤文件名的同时,还应单独验证扩展名的合法性,防止恶意脚本文件上传。
限制文件名长度:避免文件名过长导致系统兼容性问题。
路径安全:过滤文件名不能完全代替路径安全检查,防止目录遍历等漏洞。
多语言支持:mb_scrub 对多字节字符支持较好,适合国际化应用。
通过合理使用类似 mb_scrub 的函数,可以极大提升文件名处理的安全性和稳定性,是 PHP 文件上传或文件操作的重要步骤之一。