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

답변:


26

Drupal 7.15를 사용하면 노드의 액세스를 무시할 수 있습니다.

자세한 정보는 EntityFieldQuery추가 된 DANGEROUS_ACCESS_CHECK_OPT_OUT 쿼리 태그 를 참조하십시오.

EntityFieldQuery액세스 점검을 우회 할 수 있도록 "DANGEROUS_ACCESS_CHECK_OPT_OUT"쿼리 태그가 추가되었습니다 . 이전 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
좋은 해결 방법처럼 보입니다. Damien에게 감사합니다!
Weboide
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.