Tengo un método que crea una nueva sesión de usuario y la redirigirá a la pantalla anterior después de iniciar sesión correctamente. Ha introducido un problema de seguridad en el que alguien puede escribir una URL para navegar a una página a la que no debería tener acceso. La aplicación los dirigirá a iniciar sesión, pero después de iniciar sesión con credenciales válidas (pero no el nivel adecuado de autorización), los redirigirá a la página que habían escrito manualmente en la URL. ¿Cómo puedo verificar que redirect_back no está enviando a un usuario a una página a la que no debería tener acceso?

Aquí está el método de creación de sesión:

 def create
    @user = authenticate(params)
    sign_in(@user) do |status|
      if status.success?
        redirect_back root_path
      else
        flash.now.alert = status.failure_message
        render :new, status: :unauthorized
      end
    end
  end

¿Hay alguna manera de ver a qué dirección los enviará de vuelta porque podría hacer algo como

if back_url.includes? "admin"
  redirect_to root_path
end


0
Bryan Oyloe 24 feb. 2021 a las 00:49

1 respuesta

La mejor respuesta

No puede confiar en la oscuridad de la URL para la seguridad de su aplicación. Sus rutas de administración o controladores deben estar protegidos para que solo puedan acceder los administradores que hayan iniciado sesión.

Puede hacer esto con una restricción de ruta en su archivo de rutas (mi preferencia) o una acción anterior que se aplica consistentemente en todos sus controladores de administración que devuelve un 403 si el usuario actual no es un administrador.

1
Derek Prior 27 feb. 2021 a las 13:52