SQLインジェクションによる個人情報漏洩

(2/3)

SQLインジェクションとは何か

データベースはSQL*文と呼ばれる命令を受け、登録/検索/閲覧を行い、その結果を呼び出したシステムに返します。
SQL インジェクションとは、特殊な SQL 文を与え、データベースを不正に操作する攻撃、またはその攻撃を可能にする入力値の未チェックの脆弱性を指します。ダイレクト SQL コマンド・インジェクションと呼ばれることもあります。
space
たとえば、会員 ID とパスワードによるログイン処理では、データベースが SQL 文によって入力された ID とパスワードを検索し、両方が一致するレコードが存在するかどうかを調べます。
ここで、会員 ID を変数 $id、パスワードを変数 $pwdに入力し、以下の SQL 文によって、テーブル USER_LIST を検索する場合を考えます。
$login = select * from USER_LIST where user='$id' and password='$pwd'
ここで、$idが pahoo、$pwdが pass ならば、この SQL 文は、以下のようになります。
$login = select * from USER_LIST where user='pahoo' AND password='pass'
ところが、$idを空にし、$pwdに ';delete from USER_LIST where '0'='0 と入力された場合、SQL 文は以下のようになり、データベースの全レコードが選択、削除されてしまいます。(delete は削除する命令)
$login = select * from USER_LIST where user='' and password='';delete from USER_LIST where '0'='0'
また、そのサイトが利用しているデータベースの種類が明らかになれば、そのデータベースに固有のコマンドを使って、ID とパスワードをすべてダウンロードすることもできてしまいます。

SQLインジェクションへの対策は

多くの商用サイトは、データベースを利用したサービスを提供しています。とくにオンラインショップでは、会員や商品の情報を管理するために、データベースが必要不可欠です。
このため、事例で示したように、オンラインショップを狙う SQL インジェクションが増えています。オンラインショップが保有する個人情報の中にはクレジットカード番号が含まれている場合もあるので、犯罪者にとっては格好のターゲットなのです。
space
SQL インジェクションは、2004 年秋ごろから急増しています。
これは、2004 年 10 月ごろに、中国でSQL インジェクションを用いた攻撃用ツールが出回ったためです。SQL インジェクション攻撃が可能な、脆弱性を抱えたサイトを調べるツールや、そういったサイトを簡単に攻撃できるツールなどが公開されたのです。
ツールの使い方さえ分かれば、誰でもSQL インジェクションが実行できるようになってしまったのです。
裏を返せば、こうしたツールの攻撃パターンを防ぐ対策をとればよいことになります。
space
まずは、入力された SQL 文を実行する前に、その内容をチェックすることが基本です。
具体的には、SQL 文として解釈される可能性がある特殊文字(シングルクォート、バックスラッシュ、等々)を他の文字に置換(エスケープ)することが必要最低限の対策となります。
space
さらに、入力値の性質に応じてチェックをかけましょう。
たとえば英数字のみからなるパスワード入力なら、正規表現 /[0-9|a-z|A-Z]+/ とマッチするかどうかチェックするのです。これ以外は不正な文字として再入力を促します。
space
また、Web サイトで他のスクリプト(Perl, PHP, VBScript など)を利用している場合、そのスクリプトとして実行される可能性がある文字列もエスケープさせておきましょう。クロスサイトスクリプティングの防止になります。
(この項おわり)
header