.htaccess活用法(10)

.htaccess(拡張子がhtaccessということで、ドットが必要です。ファイル名がないので最初戸惑いますが、こういうものだと思ってください。)が利用可能だと、

10.ダウンロードされるべきでないファイルがダウンロードされるのを防ぐ

MIMEとはMultipurpose Internet Mail Extensionの略。例えば、htmlファイルであれば、「text/html」というMIMEタイプが設定されているのが普通であり、gif画像であれば、「image/gif」です。拡張子とMIMEタイプが1対1ならば、確かにMIMEタイプなるものの設定はサーバ側でする設定は不要なはずです。しかしながら、例えば、「http://www.example.com/getimage.cgi?image_no=123」なるURLがあった場合に、ブラウザはどのように判断すべきでしょうか? 「.cgi」は「text/html」でしょうか?

確かにCGI初心者なら、(私自信も最初はそうだった如く)CGIは(いついかなる時も)「print "Content-type: text/html\n\n";」と丸暗記していて、「text/html」と答えるかもしれません。しかし、引数を与えて動的に画像を取得するCGIで「<img src="http://www.example.com/getimage.cgi?image_no=123" width=100 >」などとHTMLファイル内で書かれていたとしたらどうでしょうか? 「print "Content-type: text/html\n\n";」なるヘッダーを吐き出せば、画像は表示されません。もし、「http://www.example.com/getimage.cgi?image_no=123」に直接アクセスすれば、意味不明な文字列がそのままprintされるだけです。GIF画像であるから意味のある絵になるのであって、これをテキストファイルとして解釈すれば、意味をなしません。

このようにMIMEタイプの指定は重要です。そして、あらかじめ、代表的なMIMEタイプについてはサーバ側で設定されています。もし、サーバ側で予め設定されていない場合は、ブラウザはそのファイルをどのように表示していいのか分からないので、そのままテキストとして表示したり、いわゆるダウンロード画面が表示されます(広義の意味では、ブラウザに画像がそのまま表示されるのであっても「ダウンロード」されていることには限りませんが、ここでは、IEなどで「セキュリティーの警告」が表示されて、「保存する」を選ぶと、保存するフォルダーを選択できる「あれ」を意味しています。)。

仮にMIMEタイプがhttpd.confや.htaccessで設定されていない拡張子のファイルの場合、ダウンロード画面が現れてしまうことから、例えば、PHPなどでinclude(or require)するファイルには注意しなければなりません。includeするということから「.inc」という拡張子を使ったとすると、たいていのサーバではそのような拡張子についてMIMEタイプが設定されていないはずですから、困った現象が起こりえます。仮にincludeファイルのファイル名が外部に漏れた場合、そのファイル名を絶対URLで指定すれば、ダウンロードされてしまいます。

対処策としては、「データファイルを守る」の章で説明したように、「.inc」ファイルへのアクセスを禁止するか(http://〜経由でのアクセスを禁止しても、PHPファイルからrequireすることは可能です。)、そもそもhttp://〜経由でのアクセスが不可能なように、DocumentRootより上に設置することも有効です。もしくは、AddTypeディレクティブを使って、しっかりとMIMEタイプを指定します。

AddType application/x-httpd-php .inc

これにより、「.inc」ファイルはPHPファイルとして解釈されますから、http://〜.incに直接アクセスされることでダウンロードされるのを防ぐことができます。

--広告--
【PR】 【1.3円/時間】GMOインターネットのSSD「ConoHa VPS」

【PR】 【COREPRESS Cloud(コアプレスクラウド)】10日間お試し無料

【PR】 GMOクラウドのVPS


「でも、inculdeファイルの名前やパスなんてハッカーでない限り分からないのでは?」と思われる方も多いでしょうが、そのようなことはありません。例えば、引数をチェックしていないプログラムで、数字しかありえないと思って作成していたプログラムに「ひらがな」などの全角文字を食わせるだけで、「Warning: pg_result(): supplied argument is not a valid PostgreSQL result resource in /home/hogehoge/public_html/data/include.inc on line 38」のようなエラーが表示される場合があります。引数を改ざんされるまでもなく、特殊な条件下で単にバグが発生するのに気づいていないケースもあるでしょう。いずれにしても、これによりincludeファイルのファイル名やパスが攻撃者に漏れてしまいます。

(検索エンジンの巡回ロボットの中には引数(URLの『?』以下)を無視して巡回するものがあります。この時、プログラム内で適切な処理がなされていない場合、引数なしでプログラムが処理されたその結果が、検索エンジンに掲載されることになります。前述のような「Warning〜」のようなセンシティブな情報が掲載されることもあります。ご注意ください。)

ですから、仮にこのような情報が攻撃者に漏れても、ダウンロードされないようにしておく必要があります。さらに、万が一ダウンロードされてもリスクが最小限になるように、例えばPostgresへの接続IDやパスワードを直接ファイルに書き込まないなどの対策は必要です。二重三重に防御は必要です。


▼ AddType ディレクティブ
http://httpd.apache.org/docs/mod/mod_mime.html#addtype

次のページでは、このAddTypeを使った実用例として、もう一つ、「SSIを「.html」で利用する方法」についてご紹介します。