我發現PHP函數basename()以及pathinfo()具有多字節utf-8名稱的奇怪行爲。 它們刪除所有非拉丁字符,直到第一個拉丁字符或標點符號。但是,之後,後續的非拉丁字符將被保留。帶有多字節UTF-8文件名的PHP basename()和pathinfo()
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的錯誤。
由於「基本名稱」檢查對於避免directoy遍歷的安全問題非常重要,是否有任何可靠的基本名稱過濾器可以與unicode輸入一起正常工作?