web-dev-qa-db-ja.com

ユーザー入力から安全なデータベースクエリを構築するには、どのような手順が必要ですか。

例Drupal 6クエリ:

_$q = db_query("SELECT id FROM {table} WHERE no = %d AND name LIKE '%%%s%%'", 
               $_GET['something'], $_GET['something_else']);
_

例Drupal 7クエリ:

_$q = new EntityFieldQuery();
$q->entityCondition('entity_type', 'some_entity')
  ->propertyCondition('id', $_GET['something'])
  ->fieldCondition('field_name', 'value', '%'.$_GET['something_else'].'%', 'like');
_

$ _GET値は、ユーザーが技術的に送信できるものであれば何でもかまいません。 PHP-sの_is_numeric_関数を数値に、db_escape_string()を文字列に使用するなどの追加の手順を実行して、入力が害を引き起こさないようにするか、クエリがすでに安全であることを確認する必要がありますか?他のデータベースAPI関数でも同じことが言えますか?

4
Madis

それはあなたが「安全」で何を意味するかによる。目的がSQLインジェクションをブロックすることだけである場合は、それだけです:) Drupal 6の場合、 db_query docsに基づいて適切なプレースホルダーを使用していることを確認してください:

有効な%修飾子は、%s、%d、%f、%b(バイナリデータ、 ''で囲まないでください)および%%です。

また、%sプレースホルダーを ''で囲むようにしてください。これらを適切に一致させないと、SQLインジェクションが発生する可能性があります。

Drupal 7がそれを処理します。 Drupal 7 db_query を使用する場合でも、:nameのようなプレースホルダーを使用すると、データ型がわかり、適切なフィルター処理/置換/引用処理が行われます。

クエリのその他のセキュリティ関連トピックは、ノードアクセスシステムです。 Drupal 6では、 db_rewrite_sql を使用する必要があります。Drupal 7では、必ず$ query-> addTag( 'node_access')を使用してください) ;ノードを照会する場合。

APIの一部としてSQLインジェクションを防止するこのシステムは、私の意見では、Drupalの優れた機能の1つです。機能とセキュリティ機能の両方を実行する同様の関数は、t()およびl()関数であり、XSSが適切に使用されている場合にこれらを防止します。

5
greggles