使用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();

Answers:


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
看来这是一个不错的解决方法,谢谢达米恩!
Weboide 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.