Soy un programador que trabaja en una aplicación donde la única opción / vs / deadline era implementar un cifrado simétrico en los valores de los parámetros de URL. Los datos son de naturaleza insensible, pero necesitábamos evitar que los agentes de ventas se asomaran entre ellos. (Las claves se generan al crear la sesión y son criptográficamente sólidas). Se espera que las sesiones terminen con frecuencia.
La jerarquía de funciones era Administrador - > Supervisor - > Agentes. Las estructuras de datos actualmente no tienen en cuenta estos roles de manera que se haga cumplir estrictamente quién puede ver qué. Obtener esta información de la base de datos NO fue en absoluto algo sencillo. (Base de datos recursiva).
Sé que esta técnica está muy abajo en la lista como defensa contra la manipulación de parámetros. ¿Cuál hubiera sido una técnica mejor?
Restricciones:
La verificación basada en roles no es una opción.
[Información adicional] Las direcciones URL creadas y enviadas al cliente antes de realizar cualquier cambio parecían:
https://www.example.com/agent/?producerId=12345
La superficie de amenaza específica aquí es la manipulación de parámetros contra? agentId = 12345. Las identificaciones de los agentes se asignan de forma única a cada agente. Entonces, si el Agente A quiere ver las estadísticas del Agente B, podría haber ingresado a agentId = 22222 para ver las cotizaciones de ese agente y las estadísticas de ventas actuales.
Una vez más, la comprobación basada en roles no era una opción para mí: no pude realizar cambios en la base de datos O en el nivel de persistencia.
Mi solución fue utilizar una clave de cifrado creada por la sesión (utilizando la clase KeyGenerator de Java) y cifrar las direcciones URL de salida enviadas al cliente. Así que ahora, la url se ve como:
https://www.example.com/agent/?producerId=<ciphertext>
Ahora, si alguien intenta agentId = 22222, el servidor descifra lo que piensa es texto cifrado y, en última instancia, creará una secuencia de caracteres no válida.
(Esto deja abierta la posibilidad de que se pueda encontrar un AgentId , pero es poco probable que sea relevante para la persona que realiza el ataque.
Enfatizaré que esta pregunta no se trata de la seguridad óptima (que sería una verificación basada en roles para garantizar el acceso a los recursos) y de tratar de exprimir algo de seguridad en un área gris.
=============== Actualización ============
Uno de nuestros tipos de seguridad me recomendó la solución de cifrado de parámetros aquí. Obtuve una información para llevar que no había considerado en esta solución - urls rotas - y utilizaré que , así como el problema de mantenimiento creado por esta solución para discutir el tiempo para hacer cumplir las reglas de acceso De una manera menos provisional.