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:
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:
<?phpfunction 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
donde encuentro el hook_views_post_build???
Curioso,no está en la doc
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
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
buenos cambiando la llamada a la funcion por la que tenia que era:
<?phpfunction 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
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
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
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:
<?phpfunction 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
?>
¿ya está listo el módulo? ¿activándolo funcionará?
varias cosas, crea los
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
<?phpif (! $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
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,
¿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
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