EntityFieldQueryを使用するときにnode_accessをバイパスする方法は?


12

次のコードでは、現在のユーザーに「ノードアクセスのバイパス」(正確な検証については_node_query_node_access_alter()を参照)がない場合、クエリはnode_accessをチェックしますが、「node_access」タグを使用していません。

管理者以外のユーザーに対する次のクエリでnode_accessチェックを回避するにはどうすればよいですか?

私はこのコードをモジュールから使用しているので、パーミッションを自分で確認できます。node_accessチェックは必要ありません。

  $query = new EntityFieldQuery;
  $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'foo')
    ->fieldCondition('custom_id', 'value', $custom_id)
    ->execute();

回答:


26

Drupal 7.15では、ノードへのアクセスをバイパスできます。

詳細については、EntityFieldQuery追加されたDANGEROUS_ACCESS_CHECK_OPT_OUTクエリタグを参照してください。

「DANGEROUS_ACCESS_CHECK_OPT_OUT」クエリタグが追加さEntityFieldQueryれ、アクセスチェックをバイパスできるようになりました。以前は、を介して実行されるクエリEntityFieldQueryは常にノードアクセスシステムによって変更され、予期しない動作やデータ損失を引き起こす可能性がありました。

モジュールのAPI内の内部クエリでアクセスチェックをバイパスする必要がある場合は、このタグを追加できますが、必要な場合にのみ行う必要があります。結果がユーザーに表示されるクエリにこのクエリタグを追加すると、すべてのアクセスチェックがバイパスされ、機密情報が公開される可能性があります。

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}

わあ、気づかないうちにしばらくこれに悩まされてきました。そのようなクエリの無数の無害な使用がある場合、それは「危険」であることを愛してください。:P
Ryan Szrama

11

答えはあなたができないということです。

accountメタデータを追加するために考えられる唯一の回避策:

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'foo')
  ->fieldCondition('custom_id', 'value', $custom_id)
  ->addMetaData('account', user_load(1))
  ->execute();

編集:DANGEROUS_ACCESS_CHECK_OPT_OUTDrupal 7.15セキュリティリリースの一部としてオプションが追加されました。


1
それは良い回避策のように見えます、Damienに感謝します!
Weboide 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.