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() の dirname 部分は正常に動作します:
pathinfo("àyà/àxà", PATHINFO_DIRNAME); // returns "àyà"
PHP のドキュメントでは、basename()およびpathinfo()pathinfo(..., PATHINFO_BASENAME)
関数はロケールを認識していると警告していますが、これはとの間の不一致を正当化するものではありません。またpathinfo(..., PATHINFO_DIRNAME)
、ラテン文字との相対的な位置に応じて、同一の非ラテン文字が破棄または受け入れられるという事実は言うまでもありません。文字。
PHPのバグのようです。
「ベース名」チェックは、セキュリティ上の問題が直接トラバーサルを回避するために非常に重要であるため、ユニコード入力で適切に機能する信頼できるベース名フィルターはありますか?