web-dev-qa-db-ja.com

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

次のコードでは、現在のユーザーが「ノードアクセスのバイパス」を持たない場合(正確な検証については _ node_query_node_access_alter() を参照)、「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();
12
Weboide

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();
}
26
user9221

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

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_OUTオプションは、Drupal 7.15セキュリティリリースの一部として追加されました。

11
Damien Tournoud