SQLインジェクション(SQLの挿入)は,Webアプリケーションへの攻撃手法の一つです。Webサーバーに対して特殊なデータを送ることで,アプリケーション開発者が想定していないSQL文を実行させます。この攻撃に対する対策を怠ると,データベース内の情報を不正に取得されたり,削除されたりする危険性があります。

 SQLインジェクションに対するぜい弱性は,クライアントから受け取ったデータをもとにしてデータベースへのアクセスを実行するSQL文を組み立てる個所で発生します。例えばアプリケーションのプログラム中に,SQL文で操作対象のレコードを絞り込むWHERE句を組み立てる“WHERE userid='$uid'”のようなコードが書かれているとします。プログラマは,変数$uidにはクライアントから受け取ったユーザーIDを格納することを想定しています。

 ところが,悪意のあるユーザーが“' OR 1=1--”のようなデータをユーザーIDとして入力すると,プログラムが組み立てるWHERE句は“WHERE userid='' OR 1=1--'”となります。これはuseridが空か,あるいは1=1が成立するレコード,つまりすべてのレコードを対象とするという意味のWHERE句となります(“--”は行末までをコメントとして無視する)。そのため,WHERE句成立の条件下で行うSQL文のコマンドが無条件に実行されてしまいます。例えば,SELECTであればデータベース内の全レコードを読み出せてしまいます。

 こうしたぜい弱性をなくすには,入力されたデータ(ここでは変数$uid)の中に,SQL文で特別な意味を持つ文字(ここではシングルクォート)が含まれていたら,SQL文を実行する前に,それを安全な文字に置き換える処理(エスケープ処理)をしておく必要があります。こうした処理を,サニタイジング(sanitizing,sanitize=無害にする)と呼ぶこともあります。

 SQL文の組み立てに限らず,一般にユーザーが入力したデータをプログラム内に埋め込んで使用する際には,その用途に応じたエスケープ処理が必要です。例えば,データをWebページに埋め込む際には,Webページの記述で特別な意味を持つHTMLタグに使われる文字(“<”や“>”など)のエスケープ処理が必要です。