Acceso de usuario a la comprobación de derechos sobre objetos o registros de bases de datos particulares

StackOverflow https://stackoverflow.com/questions/254610

Pregunta

Estoy teniendo un debate amistoso con un desarrollador sobre una situación en la que los usuarios inician sesión y acceden a documentos en una aplicación web. Cuando cargamos el documento para que lo vea el usuario, tenemos el ID de usuario en sesión y el ID de documento que se puede pasar a través de QueryString.

Para evitar que el usuario modifique el ID de documento en el QueryString, propongo que el procedimiento almacenado que carga el documento tome el UserId como parámetro para validar los derechos del documento.

Mi amigo desarrollador sugiere que ejecutemos un procedimiento separado para determinar los derechos de acceso al documento anteriormente en la página y simplemente ejecutamos un procedimiento para capturar el documento cuando se debe mostrar el documento.

¿Nos estamos perdiendo algo? ¿Cuál es más eficiente y seguro? Pensé que pasar el UserId con el DocID en una llamada de procedimiento para verificar los derechos y extraer el documento era una solución más eficiente.

¿Fue útil?

Solución

Estrictamente desde una perspectiva de rendimiento, sería mejor pasar el ID de usuario junto con el ID de documento a un procedimiento almacenado. Sólo tiene un viaje de ida y vuelta al servidor de base de datos. Además, como han señalado otros, si va a recuperar este documento de otras páginas o aplicaciones, si utiliza el mismo procedimiento almacenado, se asegura de que no está eludiendo la seguridad para hacerlo.

Sin embargo, hay situaciones en las que tener procedimientos de almacenamiento de verificación de seguridad dedicados tiene sentido. Si tiene otros recursos que desea proteger además de los documentos, y su código de verificación no es trivial, es posible que no desee duplicar el código de verificación en cada procedimiento almacenado en su base de datos. En ese caso, puede tener sentido mover la infraestructura de seguridad a su capa de acceso a datos y hacer que la capa de acceso a datos realice la llamada db para autorizar el acceso antes de recuperar el recurso solicitado. Si toma esta ruta, no querrá confiar en que el desarrollador siempre tenga que acordarse de realizar una llamada de autorización db antes de solicitar un recurso.

Otros consejos

  

Propongo que el procedimiento almacenado   que carga el documento toma el   UserId como parámetro para validar   derechos sobre el documento.

Creo que este es el camino a seguir. Si por ninguna otra razón es más seguro. Si reutiliza este proceso y luego olvida verificar el acceso, ha abierto un gran agujero. De esta manera, es evidente que no puedes acceder al documento a menos que tengas acceso.

El ID de usuario debe ser una variable de sesión. Correcto. Pase el ID de documento en la cadena de consulta. Sí.

Suponiendo que los documentos se almacenan en la base de datos, tendría una tabla para los permisos: un ID de registro, un ID de usuario y un ID de documento. Realiza una combinación con esta tabla al llamar el documento. Si no obtiene un resultado, no obtiene el documento. Índice todo muy bien y será rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top