PHP:インクルードファイルのセキュリティ対策

PHP:インクルードファイルのセキュリティ対策

author : koki

publish date :

PHPを開発中に共通の設定や使い回せる関数が書かれたファイルをインクルードさせる時があると思いますが、設置場所や公開設定はどう決めていますか?

公開フォルダにアップしていると、何らかの拍子でパスワード等が載っている設定情報が丸見え状態になった場合取り返しがつかないことになりかねません。(サーバーの設定によっては.txt、.dat、.log、.iniや.incなどの拡張子は丸見え状態です)
なので、インクルードされるファイルは極力公開ディレクトリには置かないを徹底するのが一番得策です。

ですが、いろんな理由で公開ディレクトリに置いている場合もあると思います。なるべくセキュリティを上げるための方法を今回はご紹介します。

テキストファイルにアクセス制限をかけたい場合

アクセス制限をかけたいファイルがテキストファイルの場合、サーバー側の設定でブラウザ経由でのアクセスをさせない方法で対応します。

.htaccessでファイルへのアクセスを制限する

サーバーに.htaccessを設置できる場合は、下記.htaccessコードを追記してください。
下記3行のコードで特定の拡張子のファイルへのアクセスを制限することができます。

<Files ~ ".(txt|dat|log|ini|inc)$">
	deny from all
</Files>

このコードで.txt、.dat、.log、.iniや.incの5種類の拡張子ファイルへのアクセスができなくなります。

ファイルパーミッションを変更する

アクセス制限をかけたいファイルのファイルパーミッションを変更してアクセスを制限する方法です。
アクセスを制限したいファイルのファイルパーミッションをFTPソフトなどで「640」のように3桁目をゼロに変更するとそのファイルはブラウザ経由での閲覧ができなくなります。

.htaccessの方法では拡張子の指定だけで一括してアクセス制限することができますが、ファイルパーミッションを変更する場合はそれぞれのファイルを変更する必要があります。
どちらの方法でもアクセスができなくなりますが、HTTPステータスコードが403となるので隠している感が出てしまいます・・・

PHPファイルにアクセス制限をかけたい場合

PHPファイルはテキストファイルと違いブラウザから直接アクセスしても内容を全て表示することはありません。
ですが、PHPファイルにアクセスがあるだけで動く処理を入れている場合など、外部からのアクセスは受け付けたくないときもあるかと思います。そのようなときはスクリプトに直接アクセスした場合を検知して、分岐処理を入れておくといいと思います。

スクリプトに直接アクセスした場合を検知する

PHPファイルに直接アクセスされた場合は別処理をするコードを追記します。
下記コードをスクリプトに追記してください。

<?php
if(array_shift(get_included_files()) !== __FILE__){
	// インクルードファイルとして実行された場合の処理
}else{
	// 直接ファイルが開かれた場合の処理
}
?>

私もまだ知らないだけでもっといい方法があるかもしれませんが、公開ディレクトリに設定ファイルなどを置く場合は最低でも何らかアクセス制限をかける必要があります。
冒頭にも書きましたが、設計段階で物事を決定できるのであればインクルードファイルは公開ディレクトリに置かないほうが賢明です。