■SQLインジェクション(SQL injection)
リクエストのパラメータに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文などが含まれないようにする。またSQLでコマンドの区切り記号などに利用される特殊文字は、エスケープ処理を行ったり、変数内で使えなくしたりすることも重要だ。
|