データベースファイルは公開ディレクトリに格納すべきではない

 先日の日記書籍「はじめてのPHPプログラミング基本編5.3対応」にSQLインジェクション脆弱性 - 徳丸浩の日記(2008-10-29)にて、はじめてのPHPプログラミング 基本編―5.3対応を取り上げた際に、『その「ゆるさ」のゆえんはおいおい報告する』と予告していた。書くネタは決まっていたのだが、多忙のために果たせていなかったが、今日から少しずつ報告しよう。まずはデータベースの格納場所についてだ。

 本書ではSQLの説明にSQLiteを使用している。SQLiteは、常駐サービス/デーモンがなく、アクセスライブラリが直接単一のデータファイルを参照する実装となっていて、早い話がACCESS(.mdb)のような実装だ。このデータファイルの置き場所が問題だ。
 本書には、以下のような記述がある。


現時点でindex.phpSQLiteのデータベースファイルminiblogが同じディレクトリに存在しています。つまり、miniblogファイルにブラウザから直接アクセスできてしまうということです。
「はじめてのPHPプログラミング基本編5.3対応」P285より引用

 この指摘は正しいのだが、問題はその対策方法だ。本書では、httpd.confにminiblogに対するアクセス制限を指定する方法を説明している。
 だが、この方法はベストではないだろう。重要なデータファイルは、外部から閲覧できるディレクトリに格納すべきではない。外部から閲覧できないディレクトリにしておけば、httpd.confにわざわざ指定する必要もないのだ。
 httpd.confで指定する方法のデメリットは、指定が漏れる懸念がつきまとうことだ。たとえば、開発したアプリケーションを他のサーバに移設することはよくある話だが、アプリケーションとデータは移行しても、httpd.confの設定の移行は忘れがちだ。それゆえ、httpd.confで「見えなくする」のではなく、あらかじめ見えない領域においた方が簡単だし、なにより安全だ。

追記(2008/11/09 18:32)

 レンタルサーバーでは公開ディレクトリにデータファイルを配置することがやむを得ない場合があるのではという指摘を受けた。確かにそういう場合もあるが、(1)まず原則を教えるべき、(2)レンタルサーバーの場合はhttpd.confを編集できないので.htaccessの設定を説明すべき、ということから、やはりちぐはぐだと思う。