Bagaimana cara memotong node_access saat menggunakan EntityFieldQuery?


12

Dengan kode berikut, jika pengguna saat ini tidak memiliki 'akses simpul bypass' (lihat _node_query_node_access_alter () untuk verifikasi yang tepat), maka kueri memeriksa node_access, meskipun saya tidak menggunakan tag "node_access".

Bagaimana saya bisa menghindari pemeriksaan node_access dengan permintaan berikut untuk pengguna non-admin?

Saya menggunakan kode ini dari modul, jadi saya bisa memverifikasi izin sendiri, tidak perlu cek node_access.

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

Jawaban:


26

Drupal 7.15 memungkinkan Anda untuk memotong akses pada node.

Lihat DANGEROUS_ACCESS_CHECK_OPT_OUT tag kueri ditambahkan ke EntityFieldQuery untuk informasi lebih lanjut.

Tag kueri "DANGEROUS_ACCESS_CHECK_OPT_OUT" telah ditambahkan EntityFieldQueryuntuk membolehkan melewati pemeriksaan akses. Sebelumnya, query yang dieksekusi EntityFieldQueryakan selalu diubah oleh sistem akses node, berpotensi menyebabkan perilaku tak terduga dan kehilangan data.

Jika Anda perlu memintas pemeriksaan akses dalam kueri internal dalam API modul Anda, Anda dapat menambahkan tag ini, tetapi Anda hanya boleh melakukannya jika perlu. Jika tag kueri ini ditambahkan ke kueri yang hasilnya akan ditampilkan kepada pengguna, itu akan mem-bypass semua pemeriksaan akses, yang berpotensi mengekspos informasi sensitif.

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

Wow, saya telah terjebak oleh ini selama beberapa waktu sekarang tanpa menyadarinya. Senang bahwa itu "BERBAHAYA" ketika ada banyak kegunaan berbahaya untuk pertanyaan seperti itu. : P
Ryan Szrama

11

Jawabannya adalah Anda tidak bisa.

Satu-satunya solusi yang dapat saya pikirkan adalah menambahkan accountmetadata:

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

EDIT: DANGEROUS_ACCESS_CHECK_OPT_OUTopsi telah ditambahkan sebagai bagian dari rilis keamanan Drupal 7.15.


1
Itu terlihat seperti solusi yang baik, terima kasih Damien!
Weboide
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.