web-dev-qa-db-ja.com

db_insertは安全ですか?

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();
?>
15
user5681

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

Prepared Statements docsからのこの引用は、それを最もよく示しています:

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

同じことがDrupal 7(_db_select_、_db_delete_など)のすべてのデータベース関数に当てはまります。まだ安全でない可能性があるのはdb_query()は、渡した任意の文字列を実行しますが、db_query()を使用しても、クエリを安全にするためにパラメータを渡すことができます。

データベースアブストラクションレイヤー のドキュメントには、さらに詳しい情報があります。

13
Clive