次のページSQLインジェクションとはSQLインジェクションでは、クエリなどの任意データを、データベースが実行するSQL文に挿入します。挿入されたクエリは、意図しないデータを検索したり、データベースの情報を変更したり削除したりするというように、様々な操作をデータベースに行います。問題を実証するために次の例を見てみましょう。WHEREname='{$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に特化した文字列をエスケープすることができます。Processor)専門誌です。カナダMTA出版のphp|architect誌を日本語に翻訳し、独自の記事を加えて月刊でお届けしています。4.3.X.のリリースマネージャー。オープンソース掲示板FUDフォーラム(http://fud.prohost.org/forum/)をはじめとする数多くのプロジェクトにも貢献している。この記事の評価をお聞かせくださいボタンをクリックしますとウインドウが開きます。