Come bypassare node_access quando si utilizza EntityFieldQuery?


12

Con il codice seguente, se l'utente corrente non dispone di "bypass nodo accesso" (consultare _node_query_node_access_alter () per le verifiche esatte), la query controlla node_access, anche se non utilizzo il tag "node_access".

Come posso evitare il controllo node_access con la seguente query per un utente non amministratore?

Sto usando questo codice da un modulo, quindi posso verificare le autorizzazioni da solo, senza bisogno di controlli node_access.

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

Risposte:


26

Drupal 7.15 ti permette di bypassare l'accesso sul nodo.

Vedere DANGEROUS_ACCESS_CHECK_OPT_OUT tag di query aggiunto a EntityFieldQuery per ulteriori informazioni.

È stato aggiunto un tag di query "DANGEROUS_ACCESS_CHECK_OPT_OUT" EntityFieldQueryper consentire il controllo degli accessi. In precedenza, le query eseguite tramite EntityFieldQueryvenivano sempre modificate dal sistema di accesso al nodo, causando potenzialmente comportamenti imprevisti e perdita di dati.

Se devi bypassare i controlli di accesso in una query interna all'interno dell'API del tuo modulo, puoi aggiungere questo tag, ma dovresti farlo solo se è necessario. Se questo tag di query viene aggiunto a una query i cui risultati verranno visualizzati all'utente, ignorerà tutti i controlli di accesso, esponendo potenzialmente informazioni riservate.

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

Wow, mi sono bloccato per qualche tempo senza nemmeno accorgermene. Adoro che sia "PERICOLOSO" quando ci sono innumerevoli usi innocui per tali domande. : P
Ryan Szrama,

11

La risposta è che non puoi.

L'unica soluzione che mi viene in mente è aggiungere un 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_OUTun'opzione è stata aggiunta come parte della versione di sicurezza Drupal 7.15.


1
Sembra una buona soluzione, grazie Damien!
Weboide,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.