日記
PHPのセキュリティ (20:18)Edit

いや、今さらな話題なんだけど、ググってみてもいまいち定見らしきものが見つからなかったので。

PHPApacheモジュールで動かしてこそ」と思っているわけです。言語仕様がわかりやすくいとか、標準ライブラリが充実しているとか、ほかにも好んで使う理由はあるんだけど、一番重要なのはApacheモジュールとして動く(のが標準)ので、スクリプト起動コストが小さくてすむ(なおかつFast-CGIとかよりも扱いが手軽)ってところなわけですよ。大した処理じゃないものを頻繁に呼び出すWebアプリが多いんで。

で、まあ専用サーバーだったり、あるいはソース非公開スクリプトとかを動かしている場合は、そのメリットを満喫できるわけですけど、信頼が低い共有サーバーなんかでソース公開スクリプトを動かしている場合なんかは、いろいろ困るわけです。具体的にはIDパスワードの管理。DB接続用のID、パスワードとかをソースに書き込んじゃうと、Apacheモジュールとして動いているPHPでは他のユーザーがソースを見ることができる=ID、パスワードが漏れる。

その辺を気にし始めると、以下のような対処法が思い浮かぶわけです。

「DBアクセスを行うWebアプリはSuEXEC CGI(版PHP)としてしか動かさない」というのが一番まっとうなアプローチでしょうね。ソースを700にしておけばほかのユーザーに見られる心配はなくなる。でもPHPはApacheモジュールで動かしたいなー。でもどうせDB接続なんかがあるんじゃ起動コストを気にしたってしょうがないかなー。

「Apache実行ユーザーにDB(使用するテーブル)へのアクセス権を与える」というのは、かなり投げやりだけど、ID、パスワードを管理する必要がなくなるので、DBの内容はどうでもいい(重要なのはID、パスワードの方だ)ポリシーならばありなのかなー。

「環境ごとにランダムなID、パスワードを生成し、それをランダムな設定ファイルに書き込むようにする」という手もあるかなー。インストーラーで適当なID、パスワードを生成してそのIDに対して必要なテーブルへのアクセス権を与える。そして、そのID、パスワードを分かりにくいパスに保存する。メインのスクリプトからそのパスを参照するコードを見つけ出せばID、パスワードはばれちゃうけど、固定の場所にユーザー(あるいはシステム)が決めたID、パスワードを記述するよりはまだましかな。

世の中一般のPHP版Webアプリってどうやっているんですかね。なんかちらっと見て回った限りでは、「特に何も考えていない(=ソースにID、パスワードをそのまま書いている)」パターンが多かった気がするんだけど。管理者以外DBアクセスしないのならば、いろいろ手はあるんだけどなー。さてさてふふーん。

Published At2003-03-13 00:00Updated At2003-03-13 00:00