【发布时间】:2017-12-29 07:49:13
【问题描述】:
我发现 PHP 函数 basename() 以及 pathinfo() 具有多字节 utf-8 名称的奇怪行为。 他们删除所有非拉丁字符,直到第一个拉丁字符或标点符号。但是,在此之后,会保留后续的非拉丁字符。
basename("àxà"); // returns "xà", I would expect "àxà" or just "x" instead
pathinfo("àyà/àxà", PATHINFO_BASENAME); // returns "xà", same as above
但奇怪的是 pathinfo() 的目录名部分工作正常:
pathinfo("àyà/àxà", PATHINFO_DIRNAME); // returns "àyà"
PHP 文档警告说 basename() 和 pathinfo() 函数可以识别语言环境,但这并不能证明 pathinfo(..., PATHINFO_BASENAME) 和 pathinfo(..., PATHINFO_DIRNAME) 之间的不一致是合理的,更不用说相同的非拉丁字符被丢弃或接受,具体取决于它们相对于拉丁字符的位置。
这听起来像是一个 PHP 错误。
由于“basename”检查对于避免directoy 遍历的安全问题非常重要,是否有任何可靠的basename 过滤器可以很好地处理unicode 输入?
【问题讨论】:
标签: php unicode utf-8 pathinfo