ICDロゴ

SQLインジェクション (SQL injection)

【エス・キュー・エル/シークゥエル・インジェクション】

最終更新日: 2006/02/06

 SQLのクエリ(問い合わせ)において、リクエストのパラメータにSQL文を与え、SQLデータベースを不正に操作する攻撃、またはその攻撃を可能にする入力値の未チェックの脆弱性のこと。「ダイレクトSQLコマンド・インジェクション」とも呼ばれる。

 例えば、ユーザー名とパスワードによるWebサイトのログイン処理では、SQL文によってユーザーが入力したユーザー名とパスワードを検索し、両方が一致するレコードが存在するかどうかを調べる。ユーザー名を変数「$userid」、パスワードを変数「$passid」に入力し、以下のSQL文によって、テーブル「USER_LIST」を検索するとしよう。

$login = SELECT * FROM USER_LIST WHERE user='$userid' AND password='$passid'

 ここで、$useridが「hotfix」、$passidが「report」ならば、上のSQL文は、次のようになる。

$login = SELECT * FROM USER_LIST WHERE user='hotfix' AND password='report'

 これにより、ユーザー名が「hotfix」で、パスワードが「report」のレコードが取り出せる。

 しかし、$useridに「」(空文字列)、$passidに「';DELETE FROM USER_LIST WHERE 'A'='A」と入力された場合、SQL文は次のようになり、データベースの全レコードが選択され、削除されてしまう。

$login = SELECT * FROM USER_LIST WHERE user='' AND password='';DELETE FROM USER_LIST WHERE 'A'='A'

 このように変数にSQL文を挿入(injection)することで、通常はアクセスできないデータベースのテーブルを出力したり、削除したりできるようになる。この脆弱性を解消するには、SQL文の実行前に変数の内容のチェックを行い、変数内にSQL文などが含まれないようにする。またSQLでコマンドの区切り記号などに利用される特殊文字は、エスケープ処理を行ったり、変数内で使えなくしたりすることも重要である。

Copyright (C) 2000-2007 Digital Advantage Corp.

アイティメディアの提供サービス

キャリアアップ