2014年3月6日木曜日

Windows版PHPのbasename関数がドライブレターを除去しない問題はPHP5.4.25/PHP5.5.9で改修された

以前、「Windows版PHPのbasename関数はドライブレターを除去しない場合がある」にて、Windows版PHPのbasename関数が c:autoexec.bat などに対してそのままの文字列を返す(ドライブレター c: を除去しない)問題を報告しました。
この問題をBug #66395として報告したところ、PHP5.4.25 / PHP5.5.9にて改修されました。これらのリリースは約1ヶ月前で、そろそろ次のバージョンがリリースされますが確認が遅れておりました。
具体的には、数の左側の入力に対して、矢印の右側の結果となります。

bbb/c:autoexec.bat    → autoexec.bat
bbb/cc:autoexec.bat  → cc:autoexec.bat
c:bb/autoexec.bat     → autoexec.bat

2番目の結果に違和感のある方がおられると思いますが、これはNTFSのストリームという機能に対応したものです。ストリームについては下記を参照下さい。


当初は、1番目の例も(ストリームの書式として)c:autoexec.bat と変換されていましたが、私から追記として指摘(PHPはNTFSストリームに対応していないし、パストラバーサル対策としてはまずいよ)したところ、いやいやPHPはNTFSストリームに対応しているよ(私の確認不足でした)という返答でしたが、最終的に、コロンの前(こちらがファイル名で、コロンの後ろがストリーム名)が一文字の場合は除去するというアドホックな仕様に落ち着いたようです
個人的には、NTFSストリームはExplorer等のWindows標準ツールでも上手く扱えないものを認めても混乱の元となるだけだと思いますが、まぁ独自のこだわりがあったのでしょう。最終的な仕様は許容できるものだと思います。

ということで、Windows版PHPをお使いの方は、最新のPHPにバージョンアップを推奨します。ただし、PHP5.3の最新版5.3.28では、この問題は直っていません。

また、アプリケーション側では、basename関数を通すだけでなく、「安全なウェブサイトの作り方」にあるように、「固定のディレクトリを指定」するようにしてください。そうすれば、basename関数のBug #66395の影響を受けなくなります。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ