Cambiar las URL de la aplicacion

Hola estimados colegas!

Tengo un problema fuerte de seguridad en mi aplicacion rails y he
buscado en
la API y no consigo nada y en google ni ejemplos ni nada, les cuento:
Cuando un usuario introduce su login y contraseña la aplicacion de
acuerdo
al perfil le envía la vista que corresponde la cual es el metodo show
para
no repetir codigo…
entonces:

Hasta alli todo perfecto pero me puse a manejar el sistema con la mala
intencion de reventarlo y me doy cuenta que si entro como alumno cuyo id
=>
32 y luego cambio directamente en la URL del navegador por el id => 35
estoy
viendo las notas de alumno cuyo id => es el 35

Imaginen el desastre si la aplicacion estuviera corriendo aqui en la
universidad…

Entonces como puedo corregir ese error de seguridad?

Muchas Gracias

On Thu, Jul 24, 2008 at 6:30 PM, Manuel P.
[email protected] wrote:

http://localhost:3000/alumnos/32

Hasta alli todo perfecto pero me puse a manejar el sistema con la mala
intencion de reventarlo y me doy cuenta que si entro como alumno cuyo id =>
32 y luego cambio directamente en la URL del navegador por el id => 35 estoy
viendo las notas de alumno cuyo id => es el 35

Podes usar el controlador en singlar, para empezar y no tenes el ID en
el URL :
map.resource :alumno → http://localhost:3000/alumno/

Y usas el user del session para mostrar los datos.

Lo mismo para profesor, ademas vas a tener que validar si un alumno
entra a /profesor que pasaria, eso con un before_filter que haga un
redirect se arregla.

¡Falta Uno! - http://www.falta-uno.com.ar/
Ricardo M.

gracias ricardo pero una pregunta

si uso map.resource :alumno no me afecta en nada los CRUD que se
crearon
con el scaffold?

2008/7/25 Ricardo M. [email protected]:

para

intencion de reventarlo y me doy cuenta que si entro como alumno cuyo id

Lo mismo para profesor, ademas vas a tener que validar si un alumno
entra a /profesor que pasaria, eso con un before_filter que haga un
redirect se arregla.

Vaya me gustaria si no es mucha molestia que me explicaras mas en
detalle
ese punto

Muchas Gracias Nuevamente

El problema de seguridad no es de las URL, ni de Rails, es tuyo.
Deberías
hacer mejor el sistema de autentificación y no permitir acceder a urls a
un
usuario que no tiene permiso. Esconder las cosas no suele ser una buena
solución en seguridad ya que algún día alguien lo acaba encontrando.
Si lo que quieres es no tener un sistema de id’s predecible, puedes
crearte
una cadena aleatoria de 40 o 50 carà cteres para cada usuario (como hace
restful con el activation code) y buscar los usuarios por esa cadena que
no
es predecible, no por su id

2008/7/24 Ricardo M. [email protected]:

On Thu, Jul 24, 2008 at 6:46 PM, Manuel P.
[email protected] wrote:

gracias ricardo pero una pregunta

si uso map.resource :alumno no me afecta en nada los CRUD que se crearon
con el scaffold?

No del todo, lo unico que perdes es el index que no lo podes acceder
mas, y seguramente tengas que “singularizar” los url helpers (en lugar
de alumnos_path(@alumno) tenes que poner alumno_path y asi)

¡Falta Uno! - http://www.falta-uno.com.ar/
Ricardo M.

yo se que es mio el problema de seguridad es de logica… lo que quiero
saber como soluciona la gente que tiene mas experiencia con rails este
caso
en particular!

Si alguien me puede guiar y explicar en detalle cmo han arreglado ese
detalle se los agradeceria muchisimo…

Yo se que con apache se puede hacer algo en la configuracion para que él
(apache) te oculte las URL, bueno eso me lo dijo un colega y estoy
averuguando al respecto…

2008/7/25 Manuel González Noriega [email protected]

2008/7/24 Manuel P. [email protected]:

Hola estimados colegas!

Hasta alli todo perfecto pero me puse a manejar el sistema con la mala
intencion de reventarlo y me doy cuenta que si entro como alumno cuyo id =>
32 y luego cambio directamente en la URL del navegador por el id => 35 estoy
viendo las notas de alumno cuyo id => es el 35

Como te dicen más adelante en el hilo, el problema simplemente es que
te falta un control de seguridad que ejecute una redirección (o haga
saltar una excepción) si la id de current_user es distinta del
params[:id]


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o simplelogica.net
Recuerda comer mucha fruta y verdura.

2008/7/25 Manuel P. [email protected]:

yo se que es mio el problema de seguridad es de logica… lo que quiero
saber como soluciona la gente que tiene mas experiencia con rails este caso
en particular!

Si alguien me puede guiar y explicar en detalle cmo han arreglado ese
detalle se los agradeceria muchisimo…

Bueno, te lo he puesto creo que con bastante detalle ¿no? :slight_smile:


“un control de seguridad que ejecute una redirección (o haga
saltar una excepción) si la id de current_user es distinta del
params[:id]”

poniendo eso en ruby y metiéndolo en un before_filter ya lo tendrías

Yo se que con apache se puede hacer algo en la configuracion para que él
(apache) te oculte las URL, bueno eso me lo dijo un colega y estoy
averuguando al respecto…

Con lo anterior no es necesario, ni que bajes a Apache. Una vez tengas
el control anterior en su sitio, sí puedes poner, por elegancia, una
“named route” llamada por ejemplo ‘/yo’ de forma que ‘/yo’ equivalga a
‘alumno/[mi_id]’. Pero esto sería por dejarlo bonito, la seguridad ya
estaría resuelta con lo anterior.


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o simplelogica.net
Recuerda comer mucha fruta y verdura.

2008/7/25 Manuel P. [email protected]:

yo se que es mio el problema de seguridad es de logica… lo que quiero
saber como soluciona la gente que tiene mas experiencia con rails este caso
en particular!

Si alguien me puede guiar y explicar en detalle cmo han arreglado ese
detalle se los agradeceria muchisimo…

Yo se que con apache se puede hacer algo en la configuracion para que él
(apache) te oculte las URL, bueno eso me lo dijo un colega y estoy
averuguando al respecto…

No te líes ocultando urls ni encriptándolas.

Lee el completo el mail de Manuel.

Saludos
f.

manuel de verdad no veo como hacer ese controller… la aplicacion es
muy
grande tienes mas de 60 controller…

no crees que seria muy extenso ese controller? como lo hago? de verdad
no lo
veo

2008/7/26 Fernando G. [email protected]

2008/7/25 Manuel P. [email protected]:

manuel de verdad no veo como hacer ese controller… la aplicacion es muy
grande tienes mas de 60 controller…

Tendrá más de 60 controllers pero no creo que muchos respondan a la url:

/alumnos/32

ó

/profesores/11

Suerte
f.

Añado: el codigo de ejemplo lo pongo para darte un modelo. Puede que
ademas haya que checkear que sea un alumno, puede que index deba
protegerse… en fin los detalles has de verlos tu pero ves la idea.

El mensaje es que todas y cada una de las acciones de la aplicacion
han de validar que el usuario que las solicita esta autorizado para
ello. Si tienes agujeros de esos en los 60 controladores te va a tocar
echarle un rato a revisarlo todo.

En el caso de /alumnos/id todos los usuarios son susceptibles de poder
invocar AlumnosController#show, por tanto no se puede capar a nivel de
accion solo, pero un before_filter asociado a ese metodo

before_filter :ensure_it_is_me, :only => %w(show edit update destroy)

debe checkear en este caso que el tipo es el mismo

def ensure_it_is_me
redirect_to … if @user != @current_user
end
protected :ensure_it_is_me

donde @user seria la instancia de usuario que has debido instanciar
antes de ese filtro, tipicamente con otro filtro previo

before_filter :find_user, :only => => %w(show edit update destroy)

Dependiendo de la complejidad de los permisos puede que algo mas
encapsulado sea necesario, pero si es una cosa mas o menos sencilla
con un planteamiento asi basta.

Si tienes 60 controladores, y de momento has encontrado ese “error” yo
empezaria a pensar en empezar a testear la aplicación.