SQLインジェクション (SQL injection)
【エス・キュー・エル/シークゥエル・インジェクション】
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.