db_insertは安全ですか?


15

Drupal 7のメソッドdb_insertを使用して、Drupalデータベースのカスタムテーブルにデータを挿入しています。私はこれが好ましい方法であることを読みましたが、コードとdocoを調べたところ、値を解析する場所や、これらの値が安全であることを教えてくれる場所がどこにもありません。

一部の値はユーザーから取得されるため、SQLインジェクション攻撃をチェックする必要があります。

これは私が読んでいた例で、Drupal 6は値を解析しますが、Drupal 7バージョンは解析しません。

<?php
// Drupal 6 version
db_query('INSERT INTO {vchess_games} 
   (gid, timestamps, white, black, state, board_white, board_black) ' . "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
   $gid, $timestamps, $game['white'], $game['black'], $state, $board_white, $board_black);

// Drupal 7 version
db_insert('vchess_games')
  ->fields(array(
    'gid' => $gid,
    'timestamps' => $timestamps,
    'white' => $game['white'],
    'black' => $game['black'],
    'state' => $state,
    'board_white' => $board_white,
    'board_black' => $board_black
  ))
  ->execute();
?>

回答:


13

DrupalデータベースレイヤーはPDOをラップし、準備されたステートメントを使用するため、挿入ステートメントはサニタイズされ、SQLインジェクション攻撃から保護されます。

Prepared Statements docs からのこの引用は、次のように言っています。

準備されたステートメントのパラメーターは引用符で囲む必要はありません。ドライバーはこれを自動的に処理します。アプリケーションが準備済みステートメントのみを使用する場合、開発者はSQLインジェクションが発生しないことを確認できます(ただし、クエリの他の部分がエスケープされていない入力で構築されている場合、SQLインジェクションは引き続き可能です)。

同じことが(Drupalの7のデータベース機能の全てについて真であるdb_selectdb_deleteなど)。潜在的に安全でない可能性がdb_query()あるのは、渡された任意の文字列を実行することだけです。でもとdb_query()いえ、クエリが安全であるので、あなたはパラメータを渡すことができます。

データベース抽象化レイヤのドキュメントは、いくつかのより多くの情報を持っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.