例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関数でも同じことが言えますか?
それはあなたが「安全」で何を意味するかによる。目的が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が適切に使用されている場合にこれらを防止します。