Estoy creando una aplicación web con API reducida y en esta aplicación tenemos diferentes capas que están haciendo su propio trabajo.
La primera capa es la capa de Validación que valida la entrada del usuario y si pasa la validación, la movemos a la segunda capa (que es la capa de Control de acceso ), de lo contrario, devuelve el mensaje de error
La segunda capa es Control de acceso que verifica si el usuario tiene permiso para realizar la tarea que desea realizar. Si el usuario tiene permiso, mueve la solicitud a la siguiente capa, de lo contrario, devolverá un mensaje de error
Third Layer es Controller Layer donde tenemos la lógica de aplicación
Mi pregunta es que ¿está bien tener una capa de validación antes del control de acceso? ¿Qué sucede si el usuario está intentando realizar una tarea para la cual no tiene permiso y estamos enviando un mensaje de error de validación? El usuario estaría enviando solicitudes a un punto final y hablando con la capa de validación y una vez que pasa la validación solo entonces vería el mensajeYou can't access this!
Me parece extraño, ¿está bien así o cuáles podrían ser mis otras opciones en infraestructura?
fuente
Respuestas:
Depende de si conocer la validez de alguna entrada para una tarea que no se le permite hacer es una fuga de seguridad. Si es así, realmente debería hacerlo al revés.
La única respuesta segura a un usuario no autorizado es "acceso denegado". Si a veces la respuesta es "solicitud incorrecta" y otras veces "acceso denegado", está enviando información a un usuario no autorizado.
Como ejemplo, puede verificar en la validación de la tarea "eliminar documento" que el documento nombrado existe. Alguien sin permisos sería capaz de discernir si algo existe al intentar eliminarlo y comparar qué error recibe. Un atacante particularmente determinado podría enumerar todos los nombres de documentos (con una longitud determinada) para ver cuál existe.
fuente
Bueno, hay múltiples tipos de validación:
Comprobación de cordura básica barata, que verifica que la solicitud obviamente no está malformada.
Esto suele ser al menos parcialmente duplicado del lado del cliente, para evitar viajes de ida y vuelta inútiles.
De todos modos, debe hacerse antes del control de acceso para hacer las cosas más fáciles y menos propensas a errores, ya que no corre el riesgo de que se filtre información.
Validación más costosa que todavía no depende de ningún dato de aplicación protegido.
Si existe tal validación adicional, podría ser después del control de acceso no para evitar la fuga de datos, sino para obstaculizar los ataques de DOS.
A veces, la simple ejecución de la solicitud hace parte de esa validación implícitamente a un costo reducido o sin costo, por lo que se puede dejar aquí.
Si se duplica toda la validación del primer paso, también podría tener sentido duplicar partes de este lado del cliente.
Validación adicional dependiendo de los datos protegidos de la aplicación.
Hacerlo antes del control de acceso obviamente conlleva el riesgo de fugas de información. Por lo tanto, primero haga el control de acceso.
fuente
Debe haber alguna validación antes del control de acceso. Digamos que la API de SO tiene un punto final "editar respuesta", entonces si el usuario puede editar una respuesta particular puede depender de la respuesta (debajo de cierta reputación, un usuario solo puede editar sus propias respuestas). Por lo tanto, el parámetro "ID de respuesta" que está bien formado debe verificarse antes de que la capa de control de acceso entre en juego; posiblemente también que existe la respuesta.
OTOH, como mencionan Caleth y Greg, poner una validación más extensa antes del control de acceso es un riesgo potencial de seguridad.
Entonces las reglas duras son
Seguir estas dos reglas puede significar que debe tener alguna validación antes y otra después del control de acceso.
fuente
Además de la posible frustración de recibir un "acceso denegado" después de validar la entrada; También tenga en cuenta que la capa de Validación , a menos que sea muy simple, siempre puede necesitar información del Controlador . Teniendo esto en cuenta, creo que posicionar la Validación detrás del Control de acceso , más cerca del Controlador tiene más sentido.
fuente
Eso depende de lo que quiera decir con la capa de validación; si con eso solo quiere decir verificar la sintaxis de la solicitud, eso es seguro y algo que debe hacer de todos modos. Si su 'validación' utiliza cualquier información que un usuario sin privilegios no tiene acceso a, ya no es seguro.
Definitivamente, debe tener un verificador de cordura antes de intentar el control de acceso, pero debe asegurarse de comunicar muy claramente a todos los encargados del mantenimiento (actuales y futuros) que esta parte no debe usar información privilegiada; Cualquier verificación de este tipo debe realizarse en un paso de validación por separado después de la autenticación.
Como una verificación de cordura para el verificador de cordura, en realidad no debería tener ninguna dependencia del código en ninguna parte de su código en la parte inferior de la tubería y debe ser separable en su propio paquete que debería publicarse sin ningún problema (aparte de posibles problemas legales) . Si no puede hacer eso, su 'capa de validación' está haciendo demasiado (o su base de código es un desastre).
fuente
No. No esta bien.
Si tiene un error en su capa de validación, puede pasar por alto la capa de seguridad.
Es un error común considerar la seguridad como parte de los requisitos comerciales. "solo los usuarios con el rol de ventas deberían poder ver las cifras trimestrales" parece una regla de negocios.
Pero si desea estar seguro, debe leer una regla como "solo los usuarios en el rol de ventas deben poder ejecutar el código en este punto final" Debe asegurarse de que su servidor siempre devuelva "acceso denegado" antes de que llegue a cualquier tipo de código que haya escrito o archivos en el servidor.
fuente