読者です 読者をやめる 読者になる 読者になる

WEBセキュリティ SQLインジェクション

この脆弱性があると、任意のSQLが実行されてしまう。1つでもあるとアウト。

PHPでいうと
$query = "SELECT * FROM MST_CARD WHERE id=$id"; 
のようにSQLクエリを作っていると、$idにSQL入りの文字列を埋め込まれてしまう。

そこで?(プレースホルダ)を使う。
$query = "SELECT * FROM MST_CARD WHERE id=?";
? = 123 
この2つをデータベースエンジン(InnoDBなど)に送り、
?をリテラル(数値や文字列)としてバインド(展開)することで
?はSQLとして処理されない。
これを静的プレースホルダといい、このフローに従えば脆弱性はない。
Prepared Statementとも呼ばれる。

動的プレースホルダというのもある。
データベースエンジンではなく、アプリケーション側で?のバインドをする。
こちらはバインドのライブラリによっては脆弱になる。

参考:IPA 安全なSQLの呼び出し方 http://www.ipa.go.jp/files/000017320.pdf