当前位置: 首页> 最新文章列表> 使用 mb_scrub 过滤文件名字符串的示例代码及详细讲解有哪些?

使用 mb_scrub 过滤文件名字符串的示例代码及详细讲解有哪些?

gitbox 2025-07-01

在处理文件上传或文件操作时,文件名的安全性和合法性非常重要。非法的文件名可能导致系统错误、安全漏洞甚至文件覆盖风险。本文介绍了一种基于 PHP 的自定义函数 mb_scrub,用于过滤和规范文件名字符串,尤其适合包含多字节字符的场景。

mb_scrub 函数的设计理念

  1. 编码统一
    为了正确处理多字节字符(如中文、日文、韩文等),首先使用 mb_convert_encoding 将输入字符串统一转成 UTF-8 编码,避免字符截断或乱码。

  2. 字符过滤
    通过正则表达式,保留特定的合法字符集合。通常文件名允许的字符有:

    • 英文字母(大小写)

    • 数字

    • 下划线 _

    • 句点 .

    • 连字符 -

    这些字符既能满足大多数文件名需求,也避免了特殊字符带来的风险。

  3. 避免特殊开头
    文件名以点开头通常表示隐藏文件或特殊系统文件。用 ltrim 去掉开头多余的点,确保不会无意中创建隐藏文件。

  4. 空字符串保护
    如果过滤后文件名为空字符串,自动赋予一个默认文件名(如 default_filename),防止后续文件操作出错。

示例代码说明

示例中输入文件名为 非法文件名<>:"/\|?*.txt,其中包含了许多非法字符。经过 mb_scrub 处理后,只剩下允许的字符,示例输出如下:

<span><span><span class="hljs-section">原始文件名:非法文件名&lt;&gt;:"/\|?*.txt</span></span><span>
过滤后文件名:txt
</span></span>

这里示例较为简单,实际项目中可以根据需求对允许字符集进行调整,或者结合额外规则(如限制长度、限制扩展名等)。

使用建议

  • 结合文件扩展名检查:过滤文件名的同时,还应单独验证扩展名的合法性,防止恶意脚本文件上传。

  • 限制文件名长度:避免文件名过长导致系统兼容性问题。

  • 路径安全:过滤文件名不能完全代替路径安全检查,防止目录遍历等漏洞。

  • 多语言支持mb_scrub 对多字节字符支持较好,适合国际化应用。

通过合理使用类似 mb_scrub 的函数,可以极大提升文件名处理的安全性和稳定性,是 PHP 文件上传或文件操作的重要步骤之一。