この脆弱性があると、任意の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