『安全なSQLの呼び出し方』の勉強 その1
IPAから安全なSQLの呼び出し方というPDFが公開されました。
http://www.ipa.go.jp/security/vuln/websecurity.html
せっかくなので勉強してみまして、その要約というか自分のメモを公開します。
————————————————
対策は
・文字列リテラルのエスケープ
・数値リテラルのエスケープ
をいかに行うか?に尽きる。
文字列をクォートする時に、文字列の中にシングルクォートが現れる場合が問題。
SELECT * FROM employee WHERE name=’O’Reilly’
O’Reilly
は
O"Reilly
とすればよい。
エスケープが必要な文字は他にもあり。
数字リテラルはクォートしないため、文字列リテラルのエスケープに相当する処理はなし。
PerlやPHPなど、変数に型のない言語を使用している場合に注意が必要。
~引用p10~
アプリケーション開発者は変数に数値が入っているつもりでも、
数値以外の文字が入力された場合、
変数に型のない言語では、それを文字列として扱ってしまいます。
~~~~~
$q = “SELECT * FROM atable WHERE id=$id;";
$id = “0;DELETE FROM atable";
展開結果
SELECT * FROM atable WHERE id=0;DELETE FROM atable;
対策方法
パラメータを正しくリテラルとして展開する。
1)文字列リテラルは、エスケープすべき文字はエスケープ
2)数値リテラルは、数値以外の文字を混入させない
プレースホルダによるSQL組み立てが好ましく、プレースホルダには
静的プレースホルダ
動的プレースホルダ
の2種類があり、静的プレースホルダが最も安全。
続く・・・
ディスカッション
コメント一覧
まだ、コメントがありません