Consultas para el acceso a nodos restringidos en Drupal

RECU-0556 (Recurso Ejemplo)

Descripción

A continuación se muestra un ejemplo para consultar el acceso a nodos restringidos en Drupal

Ejemplos

Si se tiene como ejemplo lo siguiente, la página principal de Drupal tiene una lista de nodes y links que te llevan al contenido de los citados nodos. Imagine que esta instalado el modulo Private y se han creado dos nodos, el nodo1 visible para todos los usuarios y el nodo 2 que tiene el acceso restringido mediante el modulo Private. La consulta para listar los nodos de la pagina principal es ejecutada en el pager_query:

SELECT DISTINCT(n.nid), n.sticky, n.created
FROM node n
WHERE n.promote = 1
AND n.status = 1
ORDER BY n.sticky DESC, n.created DESC
LIMIT 0, 10

Despues de habilitar y configurar el modulo Private, la consulta se reescribe para incluir los limites. Estas condiciones específicas son añadidas por un usuario que no es el autor del módulo, por lo que puede que se le deniegue el acceso al nodo

SELECT DISTINCT(n.nid), n.sticky, n.created
FROM node n INNER JOIN node_access na ON na.nid = n.nid
WHERE (na.grant_view >= 1 AND (
(na.gid = 0 AND na.realm = 'all’)
OR (na.gid = 0 AND na.realm = 'private_author’)))
AND ( n.promote = 1 AND n.status = 1 )
ORDER BY n.sticky DESC, n.created DESC LIMIT 0, 10

En la primera consulta, solo las condiciones aseguran que los nodos son promocionados desde la pagina de inicio y publicados. En la segunda consulta, hay un conjunto mucho mas complejo de condiciones y un join a la tabla node access. Se puede especificar las condiciones después, pero db_rewrite_sql esta modificando la consulta para añadir controles para mostrar solo los nodos que debe de permitir el usuario

El modulo Vulnerable provee una pagina que lista los nodos que no usa el sistema. Dentro de la función vulnerable_node_list esta la consulta

$results = db_query(“SELECT n.nid, n.title, nr.body FROM {node} n
INNER JOIN {node_revisions} nr ON n.vid = nr.vid“);

Cuando es ejecutado por un usuario autenticado o un usuario anónimo, el resultado es que todos los datos se muestran independientemente de los permisos del usuario. Varios cambios son necesarios para hacer esta función de seguridad. Una opción simple es agregar una restricción al menú para que sólo los usuarios con el permiso para la administración de los nodos,pueden acceder a la página. Esto funciona, pero no es la meta. En cambio,la consulta debe ser modificado de varias maneras. Lo primero es introducir una condición WHERE para chequear que el nodo esta publicado:

$results = db_query(“SELECT n.nid, n.title, nr.body FROM {node} n
INNER JOIN {node_revisions} nr ON n.vid = nr.vid WHERE
n.status = 1“);

Lo siguiente sería envolver la consulta con una llamada a db_rewrite_sql:

$results = db_query(db_rewrite_sql(“SELECT n.nid, n.title, nr.body
FROM {node} n INNER JOIN {node_revisions} nr ON n.vid = nr.vid
WHERE n.status = 1“));

Ahora cuando la consulta es ejecuta por un usuario sin privilegios , es transformado para que contenga los limites propuestos, justo como pagina de inicio mostraba previamente

Contenidos relacionados

Pautas
Área: Desarrollo » Seguridad » Control de Acceso y Autenticación
Código Título Tipo Carácter
LIBP-0254 Control de acceso Libro de pautas Directriz Obligatoria