PDOにおけるPHPクエリの問題点

ご存知の通り、SQLクエリは SQLインジェクションの危険にさらされています。PDO拡張モジュールは インジェクション対策を目的としていますが、 デフォルトでは自動的には行いません。

例を用いてこの問題を見てみましょう。 変数が挿入される次のようなクエリがあるとします。

php<?php
  $sql = "SELECT * FROM users WHERE id=$id";
  $res = $pdo->query($sql);
?>

この変数が外部から、例えばGETパラメータから 来ると仮定します。 しかし、簡単にするために、 手動でその値を設定しましょう。 例えば次のような数値が 期待されます。

php<?php
  $id = 1;
?>

しかし、悪意のあるハッカーは (フィールドroleがあると仮定して) 次のような値を渡す可能性があります。

php<?php
  $id = '-1 OR role="admin"';
?>

つまり、私たちが意図したクエリは以下の通りです。

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

しかし、実際に得られたクエリは サイトの管理者を取得する以下のものになってしまいます。

php<?php
  $sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
  $res = $pdo->query($sql);
?>

このような状況を避けるため、PDOには プリペアドステートメントと呼ばれる 特別なメカニズムが用意されています。 それについては次のレッスンで詳しく見ていきます。

Задание 1

意図的にあなたのデータベースに対して SQLインジェクションを実行してみてください。