SQLインジェクション② エスケープ処理
本来の使い方
ID
パスワード
プログラム内部処理
SELECT * FROM UserTable WHERE id=’test_user’ AND pass=’test_pass’
本来はid=’test_user’でかつpass=’test_pass’のレコードがある場合だけ認証が成功する。
つまりIDとパスワードを知っていないとログインできない。
SQLインジェクション攻撃例
ID
パスワード
プログラム内部処理
SELECT * FROM UserTable WHERE id=” OR ‘A’ = ‘A’ AND pass=” OR ‘A’ = ‘A’
ID、パスワード共に’A’=’A’であればOKとしているのでこれで通ってしまう。
つまりIDとパスワードを知らなくてもログインできる。
エスケープ処理とは特定の文字を別の文字に書き換えてしまう事。
具体的には、
「’」(シングルコーテーション)
「”」(ダブルコーテーション)
「;」(セミコロン)
「\」(バックスラッシュ)
「\n」(バックスラッシュ+n)
「–」(マイナス)
等をプログラム処理によって別文字に置換する。
多くは「’」→「”」の様に2つにする。
(※データベースの種類によってSQL文改行方法が異なるのでエスケープの処理方法も異なる)
「’」「”」を置換するのは上記例の様に「” OR ‘A’ = ‘A’」という様な条件文を作らせない為。
「;」「/」「/n」を置換するのは改行させない為。
改行されると上記例と同じ様に複数のSQL命令が実行されてしまう。
「–」はコメント開始を表す。(これもまた悪用される)
例
SQLインジェクション攻撃例
ID
パスワード
プログラム内部処理
SELECT * FROM UserTable WHERE id=’a’ AND pass=’a’
Delete * From UserTable
1行目の命令はid、passが間違っている為成功しないが、
2行目の命令はid、passに関係がないので成功してしまう。
これを防止する。