Fallo en seguridad

Events happening in the community are now at Drupal community events on www.drupal.org.
r_e_m's picture

HOla!!!

A ver si me podéis ayudar porque he encontrado un fallo de seguridad en mi aplicación de drupal.

Tengo varios tipos de roles:

administrador
jefe
responsable

Cuando un usuario se registra, le asigno un equipo y un rol, y así voy creando distintos grupos de tal manera que solo pueda ver cada usuario la información de su equipo.

Pues tengo unas vista llamada "facturas" a la que le paso un argumento con codigo php para que solo me muestre las facturas del equipo de trabajo del usuario.
Eso lo hace bien.

Pero si directamente en la barra del navegador (donde me aparece la URL) le añado el enlace que yo quiera, me accede.

Ej:

1) si estoy registrada con un usuario "jefe" y pongo en el navegador "q=/administrador/facturas/" me accede a las facturas.

2) si estoy registrada como jefe con URL en "q=/jefe/proyectos" y la cambio por "/administrador/proyectos/" y "/responsable/proyectos/" entra también.

¿Cómo puedo bloquear esto?

¿hay alguna manera de que no se muestre la URL o cambiarla por otra, para que los usuarios no sepan a donde ir aunque intenten cambiarla?

Muchas gracias!

Comments

La pregunta correcta sería:

penyaskito's picture

La pregunta correcta sería: ¿Cómo puedo validar esta entrada del usuario? Cambiar urls y demás te permitirá "esconder" el problema, pero seguirá estando ahí.

La primera idea que se me ocurre es usar el hook hook_views_post_build de views, y evaluar ahí si el argumento dado corresponde al equipo del usuario actual.

Algo tal que:

<?php
function mimodulo_views_post_build(&$view) {
  if (
$view->name == 'mi_view') {
    global
$user;
   
// En $view->args te
   
$equipo = $view->args[0];
   
// Validar que $user puede acceder a $equipo.
   
if (! $valido) {
     
// No ejecutar la view.
     
drupal_set_message(t('Wrong team'));
     
$view->executed = TRUE;                                                  
    }
  }
}
?>

--
Christian López Espínola (@penyaskito)

donde encuentro el

r_e_m's picture

donde encuentro el hook_views_post_build???

Curioso,no está en la doc

penyaskito's picture

Curioso,no está en la doc oficial. Aquí sí lo tienes:

hook_views_post_build

--
Christian López Espínola (@penyaskito)

He puesto dentro de

r_e_m's picture

He puesto dentro de sites/all/modules/views/docs/docs.php el código que me has comentado antes:

function mimodulo_views_post_build(&$view) {
if ($view->name == 'mi_view') {
global $user;
// En $view->args te
$equipo = $view->args[0];
// Validar que $user puede acceder a $equipo.
if (! $valido) {
// No ejecutar la view.
drupal_set_message(t('Wrong team'));
$view->executed = TRUE;
}
}
pero sigue dándome error.

buenos cambiando la llamada a

r_e_m's picture

buenos cambiando la llamada a la funcion por la que tenia que era:

<?php
function hook_views_post_build(&$view) {
 
// example code here
}
?>

y en "example code here" he puesto:

if ($view->name == 'mi_view') {
global $user;
// En $view->args te
$equipo = $view->args[0];
// Validar que $user puede acceder a $equipo.
if (! $valido) {
// No ejecutar la view.
drupal_set_message(t('Wrong team'));
$view->executed = TRUE;
}
}

Pero no funciona.

Tienes que crear un módulo, y

penyaskito's picture

Tienes que crear un módulo, y ahi es donde pondrás el código.

Para entender el funcionamiento de los módulos de drupal y de sus hooks: http://drupal.org/node/292

--
Christian López Espínola (@penyaskito)

también puedes desarrollar un

mgzrobles's picture

también puedes desarrollar un plugin de acceso a tu view

<?php
/**
* Implementation of hook_views_plugin().
*/
function MIMODULO_views_plugins() {
  return array(
   
'access' => array(
     
'parent' => array(
       
'no ui' => TRUE,
       
'handler' => 'views_plugin_access',
       
'parent' => '',
      ),
     
'arguments' => array(
       
'title' => t('Acceso a mi view'),
       
'help' => t('Acceso a mi view'),
       
'handler' => 'views_plugin_access_miview',
       
'uses options' => TRUE,
       
'path' => drupal_get_path('module', 'MIMODULO') . '/includes/plugins',
      ),
    ),
  );
}
/**
* Control de acceso a mi view
* @param $path
* @return TRUE si tiene permiso, FALSE en otro caso
*/
function MIFUNCIONDEACCESO($path) {

  if (
LOGICA DE VALIDACION) {
    return
TRUE;
  }

  return
FALSE;
 
}
?>

luego tendrias el fichero views_plugin_access_miview.inc con lo siguiente

<?php
/**
* A plugin to handle access control based on the arguments.
*/
class views_plugin_access_miview extends views_plugin_access {
 
/**
   * Initialize the plugin.
   *
   * @param $view
   *   The view object.
   * @param $display
   *   The display handler.
   */
 
function init(&$view, &$display) {
   
$this->view = &$view;
   
$this->display = &$display;
   
$this->options = array();

    if (
is_object($display->handler)) {
   
// Note: The below is read only.
     
$this->options = $display->handler->get_option('access');
    }
  }

 
/**
   * Retrieve the default options when this is a new access
   * control plugin
   */
 
function option_defaults(&$options) { }

 
/**
   * Provide the default form for setting options.
   */
 
function options_form(&$form, &$form_state) { }

 
/**
   * Provide the default form form for validating options
   */
 
function options_validate(&$form, &$form_state) { }

 
/**
   * Provide the default form form for submitting options
   */
 
function options_submit(&$form, &$form_state) { }

 
/**
   * Return a string to display as the clickable title for the
   * access control.
   */
 
function summary_title() {
    return
t('Acceso a mi view');
  }

 
/**
   * Determine if the current user has access or not.
   */
 
function access($account) {
   
// default to no access control.
   
return TRUE;
  }

 
/**
   * Determine the access callback and arguments.
   *
   * This information will be embedded in the menu in order to reduce
   * performance hits during menu item access testing, which happens
   * a lot.
   *
   * @return an array; the first item should be the function to call,
   *   and the second item should be an array of arguments. The first
   *   item may also be TRUE (bool only) which will indicate no
   *   access control.)
   */
 
function get_access_callback() {
   
// default to no access control.
  
   
$path = $this->display->display_options['path'];
    return array(
'MIFUNCIONDEACCESO', array($path));
  
   
  }
}
?>

Martín González Robles
web: http://elsabrosista.com
email: martin.glez.robles@gmail.com
Unidad sobre OG para Drupal 7: http://www.forcontu.com/descarga/d7u66pdf

Estoy creando un nuevo módulo

r_e_m's picture

Estoy creando un nuevo módulo y estoy siguiendo los siguientes pasos:

1) En /sites/all/modules/ he creado otro directorio para mi modulo que lo he llamado "modification_security"

2) He creado dos archivos en blanco. En el primero "modification_security.info" he puesto lo siguiente:

;$Id$
name = "Modificaciones de seguridad"
description = "Pretende solucionar fallos de acceso a datos no permitidos"
core = 6.x
php = 5.1

3) En el otro "modification_security.module" he puesto el código que penyaskito ha escrito:

<?php
function mimodulo_views_post_build(&$view) {
  if (
$view->name == 'mi_view') {
    global
$user;
   
// En $view->args te
   
$equipo = $view->args[0];
   
// Validar que $user puede acceder a $equipo.
   
if (! $valido) {
     
// No ejecutar la view.
     
drupal_set_message(t('Wrong team'));
     
$view->executed = TRUE;                                                  
    }
  }
}
pero sin el
?>
porque creo que no se puede poner, no???

¿ya está listo el módulo? ¿activándolo funcionará?

varias cosas, crea los

mgzrobles's picture

varias cosas,
crea los directorios
/sites/all/modules/custom
/sites/all/modules/contrib

En custom, meterás los módulos que vayas creando tu y en contrib los bajados de la comunidad.
sustituye mimodulo por el nombre de tu módulo, en este caso modification_security
Los ficheros php empiezan con <?php pero no se cierran con ?>
Ahora, si lo activas, tendría que entrarte en esa función, pero tendrás que meter tu
propia lógica, ya que lógicamente

<?php
if (! $valido) {
?>

no te funcionará :) ..

a parte de ese hook, también dispones de algunos otros que te podrían valer, como
hook_views_pre_render
hook_views_pre_build
http://drupalcontrib.org/api/drupal/contributions!views!docs!docs.php/group/views_hooks/6
un saludo

Martín González Robles
web: http://elsabrosista.com
email: martin.glez.robles@gmail.com
Unidad sobre OG para Drupal 7: http://www.forcontu.com/descarga/d7u66pdf

Bueno, estoy intentando hacer

r_e_m's picture

Bueno, estoy intentando hacer el módulo, y me he han surgido varios problemas y dudas. Os planteo mi escenario.

Si un usuario está viendo una vista que genera la url:
example.com/?q=usuario/rol1/facturas/8 /* está viendo información de las factura 8 que pertenece a su grupo*/

Si ahora manualmente el usuario cambia 8 por 500 (por ejemplo) siendo 500 una factura que él no puede ver porque no pertenece a su equipo, se la muestra.

Entonces lo que necesito en el módulo es primero guardar en una variable ese argumento que le pongo en el navegador (8, 500, el que sea) para luego poder compararlo.

cómo puedo hacer eso????

¿cuando creas los grupos,

mgzrobles's picture

¿cuando creas los grupos, estos son privados?

la vista de la que hablas, ¿es el detalle de una factura o una view que recibe el id como parámetro?
Si es el detalle de un nodo que pertenece a un grupo, puedes usar el
hook_node_grants o el hook_nodeapi para hacer una lógica de acceso, por ej:

<?php

function TUMODULO_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
  if (
$op === 'view' {
    if (
$node->type === 'facturas') {
     
$grupos = array_keys(og_get_node_groups($node));
     
//suponiendo que tienes un único grupo asociado
     
$grupo = node_load($grupos[0]);
      if (( !
og_is_group_member($grupo->nid) && ($grupo->og_private == 1) )) {
       
drupal_access_denied();
      }
    }
  }
}
?>

¿has implementado la lógica de acceso a views que hemos comentado anteriormente? Con ella puedes evaluar los argumentos de tu view y determinar si tiene permisos para verlo o no con algo de código similar al de arriba.

Martín González Robles
web: http://elsabrosista.com
email: martin.glez.robles@gmail.com
Unidad sobre OG para Drupal 7: http://www.forcontu.com/descarga/d7u66pdf

Quería comentaros, si sabeis

r_e_m's picture

Quería comentaros, si sabeis de algun módulo que me permita añadir código php a los filtros en Drupal 6. Es que eso me solucionaría el problema.

Ahora mismo para que un usuario solo vea lo de su grupo uso un argumento añadiendole un codigo php, pero los argumentos no me bloquean el resto de contenido, por eso tengo estos problemas de seguridad, pero si pudiese hacer eso mismo pero en vez de con argumentos, con filtros, entonces no tendría el problema, porque los filtros me bloquean todo lo que no sea lo que yo quiero mostrar

Spain

Group organizers

Group categories

Región geográfica

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: