|
|
1 2 3 次のページ
|
|
SQLインジェクションとは
|
SQLインジェクションでは、クエリなどの任意データを、データベースが実行するSQL文に挿入します。挿入されたクエリは、意図しないデータを検索したり、データベースの情報を変更したり削除したりするというように、様々な操作をデータベースに行います。問題を実証するために次の例を見てみましょう。
|
// 問題を実証するための入力
$name = "ilia'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE
name='{$name}'");
|
上記の関数内では、ユーザが指定した名前とnameカラムの値が一致したデータをusersテーブルから取り出すことを想定しています。普通、$nameには、iliaといった文字列のように、アルファベットとスペースからできた文字列が格納されています。
しかしここでは、$nameにまったく新しいクエリを加えることにより、この関数が実行されると、とんでもないことが起こります。DELETE文が実行されてusersテーブルからすべてのデータが消えてしまうのです。
|
MySQL
|
幸いなことにMySQLを使用する場合、mysql_query()関数ではクエリのスタック、言い換えると1回の関数呼び出しで複数のクエリを実行することができないようになっています。複数のクエリを一度に実行しようとすると失敗します。
しかし、SQLiteやPostgreSQLのような他のPHPデータベースエクステンションではクエリのスタックが可能なので、一度にすべてのクエリが実行され、深刻なセキュリティ上の問題を引き起こします。
|
マジッククォート
|
SQLインジェクションによって生じる問題に対処するため、PHPには自動で入力をエスケープするmagic_quotes_gpcという仕組みが備わっています。この機能が有効に設定されていれば、magic_quotes_gpc、つまり'マジッククォート'機能によって、シングルクォートやダブルクォート、その他にも値として判別される文字の直前にバックスラッシュが加えられます。
しかし、マジッククォートはエスケープする必要があるすべての文字に対応している訳ではないので、その機能によってすべての問題を解決できる訳ではありません。最終的に、SQLインジェクションを完全に防ぐには自分でエスケープの仕組みを実装する必要があります。
PHPで利用できるデータベースエクステンションには、それ専用にカスタマイズされたエスケープ機能が備わっているものが数多くあります。例えば、MySQLエクステンションではmysql_real_escape_string()関数によってMySQLに特化した文字列をエスケープすることができます。
|
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE
name='{$name}'");
|
|
1 2 3 次のページ
|
書籍紹介
PHPプログラマーズマガジン
PHPプログラマーズマガジンは、PDF形式で読者の方にお届けするPHP言語(PHP: Hypertext Processor)専門誌です。 カナダMTA出版のphp|architect誌を日本語に翻訳し、独自の記事を加えて月刊でお届けしています。
発行:アシアル株式会社 価格:1,029円
ご購入はこちら http://www.asial.co.jp/magazine/
|
|
|
|
著者プロフィール
Ilia Alshanetsky
PHP開発チームの活動メンバーの1人であり、現在のPHP 4.3.X.のリリースマネージャー。また、オープンソース掲示板FUDフォーラム(http://fud.prohost.org/forum/)をはじめとする数多くのプロジェクトにも貢献している。
|
|
|
|