ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

不適切な拡張子でもPHPが実行されてしまう可能性

大垣さんのトコやt_komuraさんのトコで知ったんだけど()。
Apacheのマニュアルを見てみると、この動作は仕様みたい。。。結構ヤバい仕様。


複数の拡張子のあるファイル

ファイルは複数の拡張子を持つことができ、拡張子の順番は通常は関係ありません。
たとえば、welcome.html.fr ファイルがコンテントタイプは text/html に、言語はフランス語にマップされる場合、welcome.fr.html もまったく同じ情報にマップされます。
唯一の例外は、与えられた拡張子の扱い方を Apache が知らない場合です。
その場合、Apache は知らない拡張子の左にあるすべての拡張子を「忘れ」ます。
ですから、たとえば、拡張子 fr と html が適切な言語とタイプにマップされているけれども、拡張子 xxx は何にも割り当てられていないという場合には、welcome.fr.xxx.htmlファイルはコンテントタイプ text/html に関連付けられますが、言語には関連付けられません。


だったら「welcome.php.xxx」はPHPとしては実行されないのでは?と思うんだけど(実際には動く)。混乱してきたぞ。。。
落ち着いて考えてみると(大垣さんが指摘している通り)ユーザからアップロードされたファイルは信頼できないモノとして扱うべきなんでしょう(ユーザからアップロードされたファイルはドキュメントルート以下に配置しない事を基本とする)。
画像登録みたいな仕組みでユーザからアップロードされる事はありそうなので(最低限)安全なファイル名に変更しておく(PHPとして動作しなくなるように)等、対応は必要なんでしょうね(ファイル名はサーバ側で強制的に定義してクライアント側の情報は利用しない)。
後、バックアップ・ファイル(これは致命的)。PHPとして動作しない場合は、ソースが丸見えになってしまう可能性がありますね。
先日のについても大垣さんが意見しています。入力値のチェックは確実に行いましょう。