ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない
元ネタはこちら。
どういうことか
次のような指定は危険である。
AddHandler php5-script .php
この時に指定される.phpはファイル名の末尾である必要はない。例えば、
aaa.php.html bbb.php.png
などもphp5-scriptとして解釈されてしまうのだ。これは.XXX.YYYと複数の拡張子が書かれた場合、.XXXと.YYYもAddHandlerの対象となることが原因。
ちなみに次のような場合にはphp5-scriptとして解釈されない。
ccc.php_foo (.php_fooとして解釈されるため) ddd.php_bar.html (.php_barと.htmlとして解釈されるため)
実はこのことはApacheのドキュメントにも明記されている
Apache モジュール mod_mime 複数の拡張子のあるファイル
ファイル名のドット区切りでの最後の部分を使って、 特定の部分のメタデータにマッピングしたい場合は、 Add* ディレクティブは使わないでください。 たとえば foo.html.cgi を CGI スクリプトとして処理したいけれども、 bar.cgi.html は CGI スクリプトとしては処理したくない場合、 AddHandler cgi-script .cgi とする代わりに 次のようにしてください
Configure handler based on final extension only<FilesMatch \.cgi$> SetHandler cgi-script </FilesMatch>
つまり仕様です。
あなたのサイト、大丈夫?
RHELやCentOSでmod_phpが用意する/etc/httpd/conf.d/php.confは以下のように記載されていた。
AddHandler php5-script .php AddType text/html .php
ビンゴです。
基本的に第三者がアップロードしたファイル名をそのまま使っていたりしなければ大丈夫だろうけど、うっかりミスでやってしまう可能性もあるし怖いですね。
対策
元ブログでや上記Apache公式ドキュメントでもFilesMatchとSetHandlerを組み合わせて使えと書かれていた。
<FilesMatch "\.(php|php5|phtml)$"> SetHandler application/x-httpd-php </FilesMatch> <FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch>
上記RHEL/CentOSのphp.confも、とりあえずFilesMatchで囲んでやれば対策になりそう。
<FilesMatch "\.php$"> AddHandler php5-script .php AddType text/html .php </FilesMatch>
FilesMatchの中であればAddHandlerでもいいんじゃないかと思う。冗長だけどね。
残念ながら世の中にはAddHandlerを設定する方法を紹介するサイトで溢れかえっているし、Apache公式ドキュメントですら一部にAddHandlerを使っている。これは啓蒙活動が必要だね、というのが元ブログの主張でした。