TOP書籍連動> Includeを使う場合




SQLインジェクション
SQLインジェクション

第3回:SQLインジェクションの注意点

著者:Ilia Alshanetsky   2006/1/31
前のページ  1  2   3  次のページ
Includeを使う場合

   Includeを使う場合はデータが他のホストやシステムから利用できないように、特定のバーチャルホストか特定ディレクトリからのみロードできるようになっているか確認してください。設定ファイルの内容はSetEnvで記述し、データベース接続に必要なすべてのパラメータを定義します。
SetEnv DB_LOGIN "login"
SetEnv DB_PASSWD "password"
SetEnv DB_DB "my_database"
SetEnv DB_HOST "127.0.0.1"

   Apacheを再起動すれば、これらの環境変数はスーパーグローバル変数の$_SERVERか、$_SERVERが使えない時はgetenv()関数でPHPスクリプトからアクセスできるようになります。

echo $_SERVER[‘DB_LOGIN’]; // login
echo getenv("DB_LOGIN"); // login

   このやり方では、接続に必要なパラメータをスクリプトからも隠蔽することができます。PHPのiniディレクティブを使ってデータベースエクステンション用にデフォルトの認証情報を用意します。これらのディレクティブは隠蔽されたApache設定ファイルの中にも記述することができます。

php_admin_value mysql.default_host
"127.0.0.1"
php_admin_value mysql.default_user "login"
php_admin_value mysql.default_password
"password"

   これで、mysql_connect()は引数なしで動くようになります。指定されていない引数はPHPのini設定から割り当てられます。あと必要な情報はデータベース名だけです。アプリケーションからデータベースの設定がわからないので、バグなどの脆弱性を突いて攻撃することはできませんが、内部のコードから行うことは可能です。そこで、iniに基づく認証プロシージャだけしか使用できないように、sql.safe_mode ディレクティブのSQLセーフモードによって強制することができます。

   こうするとPHPは認証データ用のiniの値と異なるデータを使って行うデータベース接続をすべて拒絶するようになります。古いバージョンのPHPだと、このやり方には弱点があります。バージョン4.3.5までのPHPには、iniの設定を他のバーチャルホストにも漏らしてしまうという脆弱性があります。

   特定の条件下でユーザがこのバグを突くと、システムのユーザが他のユーザのiniの値を簡単に見ることができるようになってしまうのです。もしあなたが使用しているPHPが古いバージョンなら、環境変数に気をつけるかPHPを新しいバージョンにアップグレードしてください。

   古いバージョンには他にもセキュリティ上の問題がたくさんあるので、アップグレードを強くお奨めします。データベースのパーミッション最後のデータベースセキュリティトピックはPHPとは関係ないのですが、システムのどんなコンポーネントにも適用できそうなものです。簡単にいうと与える権限をできるだけ小さくしようということです。

   例えばユーザがデータベースからデータを読み出したいだけという場合は、UPDATEやINSERTクエリの実行を許可してはいけません。もっと現実的には、セッションテーブルやユーザアカウントテーブルなど変更されると困るテーブルへの書き込みを制限します。

   ユーザができることを限定することで、SQLインジェクション攻撃の多くを見抜き、追跡し、無害化できるようになります。データベース層へのアクセスを限定することは必要不可欠です。この記事で書かれているようなデータベースをセキュアにする仕組みと一緒にぜひやってみてください。

前のページ  1  2   3  次のページ


Ilia Alshanetsky
著者プロフィール
Ilia Alshanetsky
PHP開発チームの活動メンバーの1人であり、現在のPHP 4.3.X.のリリースマネージャー。また、オープンソース掲示板FUDフォーラム(http://fud.prohost.org/forum/)をはじめとする数多くのプロジェクトにも貢献している。


INDEX
第3回:SQLインジェクションの注意点
  データベースの認証
  Includeを使う場合
  パフォーマンスの維持