このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

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.cgiCGI スクリプトとして処理したいけれども、 bar.cgi.html は CGI スクリプトとしては処理したくない場合、 AddHandler cgi-script .cgi とする代わりに 次のようにしてください
Configure handler based on final extension only

<FilesMatch \.cgi$>
SetHandler cgi-script
</FilesMatch>

つまり仕様です。

あなたのサイト、大丈夫?

RHELCentOSで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/CentOSphp.confも、とりあえずFilesMatchで囲んでやれば対策になりそう。

<FilesMatch "\.php$">
  AddHandler php5-script .php
  AddType text/html .php
</FilesMatch>

FilesMatchの中であればAddHandlerでもいいんじゃないかと思う。冗長だけどね。

残念ながら世の中にはAddHandlerを設定する方法を紹介するサイトで溢れかえっているし、Apache公式ドキュメントですら一部にAddHandlerを使っている。これは啓蒙活動が必要だね、というのが元ブログの主張でした。