PDOにおけるPHPクエリの問題点
ご存知の通り、SQLクエリは SQLインジェクションの危険にさらされています。PDO拡張モジュールは インジェクション対策を目的としていますが、 デフォルトでは自動的には行いません。
例を用いてこの問題を見てみましょう。 変数が挿入される次のようなクエリがあるとします。
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
この変数が外部から、例えばGETパラメータから 来ると仮定します。 しかし、簡単にするために、 手動でその値を設定しましょう。 例えば次のような数値が 期待されます。
<?php
$id = 1;
?>
しかし、悪意のあるハッカーは
(フィールドroleがあると仮定して)
次のような値を渡す可能性があります。
<?php
$id = '-1 OR role="admin"';
?>
つまり、私たちが意図したクエリは以下の通りです。
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
しかし、実際に得られたクエリは サイトの管理者を取得する以下のものになってしまいます。
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
このような状況を避けるため、PDOには プリペアドステートメントと呼ばれる 特別なメカニズムが用意されています。 それについては次のレッスンで詳しく見ていきます。
意図的にあなたのデータベースに対して SQLインジェクションを実行してみてください。