『安全なSQLの呼び出し方』の勉強 その1

2010年4月30日

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種類があり、静的プレースホルダが最も安全。

続く・・・