エンジニアのひよこ_level10

【毎日更新!】新卒2年目エンジニアブログです! プログラムだけじゃなく、マネジメントとかも書いていきたい!

SQL文で’INSERT INTO Pages VALUES(?, ?, ?)'のように、?を使う理由【198日目】

こんな時ありませんか

SQL文を見た時に、

INSERT INTO Pages VALUES(?, ?, ?)"

こんな感じに、一部に?が使われている時。

どんなことになるの?

?のところに、あとで数値を入れます。

PDOの時の例で言うと、

$dbh->prepare("INSERT INTO Pages VALUES(?, ?)")
    ->execute(array(1, 'Etc'));

こうすると、SQL文の ?にexecuteの配列が順番に入って、

INSERT INTO Pages VALUES(1, 'Etc');

みたいになります。

何が嬉しいの?

SQLインジェクションと呼ばれるWebサイトの攻撃対策になります。
ユーザーが意図して悪い入力をすることで、パスワードが漏洩したりするのを防ぐ事ができます。

普通に書くと困る理由

$dbh->exec("INSERT INTO Pages VALUES(" . $id . "," . $name .")");

こんな感じだとなぜダメなのか。

例えば、今回の例で言うと、$idと$nameに入る値をユーザーに入力させる時に、

$id = 1;
$name = "ETC); SELECT * From Pages;(";

という入力がされると、SQL文は

INSERT INTO Pages VALUES(1, ETC); SELECT * From Pages;()

SELECT * From Pages;が余分に実行されます。
もし、SQL文の結果を出力するシステムなら、Pagesテーブルの内容がユーザーに見られてしまう。

ただ、 ?を使うことによって、
VALUEの第一引数は1、
第二引数は"ETC); SELECT * From Pages;("という文字列、と捉えてくれるようになります。

公式ドキュメント

PHP: SQLインジェクション - Manual