4

MySQL でプリペアド ステートメントを使用すると SQL インジェクションが防止されるかどうかを確認したいだけです。

次のコードはすべての SQL インジェクション攻撃を防ぎますか?

$var = $_GET['q']; 
$trimmed = trim($var);
if ($trimmed != NULL) {
  $get_fighters = $DBH->prepare(
    'SELECT * 
    FROM fighters 
    WHERE name LIKE :searchTerm 
      OR nickname LIKE :searchTerm 
      OR born_in_city LIKE :searchTerm
      OR born_in_state LIKE :searchTerm
      OR born_in_country LIKE :searchTerm
      ORDER BY name ASC');
  $get_fighters->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR);
  $get_fighters->setFetchMode(PDO::FETCH_ASSOC);
  $get_fighters->execute();
  $check_results_fighters = $get_fighters->rowCount();

  $get_events = $DBH->prepare(
    'SELECT * 
    FROM events 
    WHERE event_name LIKE :searchTerm
      OR event_arena LIKE :searchTerm
      OR event_city LIKE :searchTerm
      OR event_state LIKE :searchTerm
      OR event_country LIKE :searchTerm
      OR organization LIKE :searchTerm
    ORDER BY event_date DESC');

  $get_events->bindValue(':searchTerm', '%' . $trimmed . '%', PDO::PARAM_STR);
  $get_events->setFetchMode(PDO::FETCH_ASSOC);
  $get_events->execute();
  $check_results_events = $get_events->rowCount(); 
}
4

2 に答える 2

7

準備されたクエリは、実行されるクエリとそのクエリに使用されるデータを分離することで攻撃を防ぎます。つまり、データをクエリに直接連結していないため、一次攻撃は発生しません。

要するに、準備されたクエリを常に使用し、すべてのデータがバインドされたパラメーター (他のクエリからのデータを含む) と共に送信される場合、SQL インジェクションに関する限り問題ありません。

(準備されたクエリをサポートしていないサーバー用の一部の PDO ドライバーは、従来のエスケープ ルーチンでそれを偽造することにも注意してください。これについて心配する必要はありません。安全です。)

于 2012-06-16T04:21:24.447 に答える
3

はい、準備されたステートメントを使用すると、php ドキュメントによると SQL インジェクションが防止されます。

リンクを見る

于 2012-06-16T04:19:13.920 に答える