はじめに
SQLインジェクションについてまとめる。
SQLインジェクションとは
SQL命令に不正なパラメータを引き渡すことで、本来開発者が意図していなかったはずのSQL命令が生成/実行されてしまうこと。
結果として、公開されるはずでなかった機密情報が漏洩したり、需要なデータが削除されてしまう可能性がある。
例
以下のようなコードがあったとして
$stt = $db->prepare("INSERT INTO book(isbn, title, price, publish, published)
VALUES('".$_POST['isbn']."', '".$_POST['title']."', '".$_POST['price']."', '".$_POST['publish']."', '".$_POST['published']."')");
$_POST['isbn']
に以下の入力がされたとき
9-999-99999', '', '', '', '');DELETE FROM book; --
以下のようなクエリが生成されてしまう。
$stt = $db->prepare("INSERT INTO book(isbn, title, price, publish, published)
VALUES('9-999-99999', '', '', '', '');DELETE FROM book; --', '', '', '', '')");
「--」はコメントを表す記号のため、「--」以降は無視されてしまう。
データを一件挿入した後、bookて0ブルの全てので0田を削除する、という命令が生成されている。
対策
SQLエスケープをする。または、PDOを使っているならプレイスホルダーを使う。