Comment contourner node_access lors de l'utilisation de EntityFieldQuery?

12

Avec le code suivant, si l'utilisateur actuel n'a pas 'accès au nœud de contournement' (voir _node_query_node_access_alter () pour les vérifications exactes), la requête vérifie pour node_access, même si je n'utilise pas la balise "node_access".

Comment puis-je éviter la vérification node_access avec la requête suivante pour un utilisateur non administrateur?

J'utilise ce code à partir d'un module, donc je peux vérifier les autorisations moi-même, pas besoin de vérifications node_access.

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

Réponses:

26

Drupal 7.15 vous permet de contourner l'accès sur le nœud.

Voir la balise de requête DANGEROUS_ACCESS_CHECK_OPT_OUT ajoutée à EntityFieldQuery pour plus d'informations.

Une balise de requête "DANGEROUS_ACCESS_CHECK_OPT_OUT" a été ajoutée EntityFieldQuerypour permettre de contourner les contrôles d'accès. Auparavant, les requêtes exécutées via EntityFieldQueryétaient toujours modifiées par le système d'accès au nœud, ce qui pouvait entraîner un comportement inattendu et une perte de données.

Si vous devez contourner les vérifications d'accès dans une requête interne au sein de l'API de votre module, vous pouvez ajouter cette balise, mais vous ne devez le faire que si cela est nécessaire. Si cette balise de requête est ajoutée à une requête dont les résultats seront affichés à l'utilisateur, elle contournera toutes les vérifications d'accès, exposant potentiellement des informations sensibles.

function MYMODULE_field_query($field) {
  $query = new EntityFieldQuery();
  return $query
    ->fieldCondition($field)
    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
    ->execute();
}
user9221
la source
Wow, je suis coincé par ça depuis un certain temps maintenant sans même m'en rendre compte. J'adore que ce soit "DANGEREUX" quand il y a d'innombrables utilisations inoffensives pour de telles requêtes. : P
Ryan Szrama
11

La réponse est que vous ne pouvez pas.

La seule solution de contournement à laquelle je peux penser pour ajouter des accountmétadonnées:

$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: une DANGEROUS_ACCESS_CHECK_OPT_OUToption a été ajoutée dans le cadre de la mise à jour de sécurité Drupal 7.15.

Damien Tournoud
la source
1
Cela ressemble à une bonne solution de contournement, merci Damien!
Weboide