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


続く・・・





コメントをどうぞ