sql - soporta - ¿Debería realizarse la seguridad de los datos en el lado de la base de datos?
restriccion check sql server (8)
Estamos en el proceso de establecer un nuevo marco y forma de hacer negocios para nuestras nuevas aplicaciones internas. Nuestro diseño actual dicta que toda la lógica de seguridad debe ser manejada por nuestra base de datos, y toda la información (y me refiero a todos) entrará y saldrá de la base de datos a través de procedimientos almacenados.
La teoría es que la capa de acceso a datos solicita información de un procedimiento almacenado y pasa la autenticación a la base de datos. La base de datos determina los roles / permisos de los usuarios y decide si realizar o no la tarea (ya sea recuperar datos o hacer una actualización).
Supongo que esto significa menos transacciones de base de datos. Una llamada a la base de datos. Si la seguridad estaba en nuestra capa de acceso a datos, esto requeriría 1 llamada a la base de datos para determinar si el usuario tenía los permisos adecuados, y luego 1 llamada de base de datos separada para realizar la acción.
Yo, por mi parte, encuentro que el estudio Sql Management carece por completo de IDE. Mi principal preocupación es que tendremos que mantener una cantidad desagradable de lógica empresarial en nuestros procedimientos almacenados para obtener ganancias de rendimiento mínimas.
En este momento, estamos usando LINQ para nuestro ORM. Parece ligero y rápido, pero lo mejor de todo es que es muy fácil desarrollarlo rápidamente.
¿El costo de mantenimiento vale la pena el rendimiento? ¿Nos estamos engañando a nosotros mismos pensando que incluso habrá un aumento notable en el rendimiento? ¿O solo estamos haciendo una pesadilla para nosotros?
Nuestro ambiente:
- Aplicaciones comerciales internas que no son de misión crítica
- C # / ASP.NET 3.5
- Windows 2003
- MS SQL Server 2005
- 35 aplicaciones web de tamaño medio con aproximadamente 500 usuarios
EN MI HUMILDE OPINIÓN:
Nivel de servicio de aplicación -> lógica de aplicación y validación
Nivel de datos de aplicación -> lógica de datos y seguridad
Base de datos -> consistencia de datos
Serás mordido por el enfoque sproc tarde o temprano, lo he aprendido de la manera difícil.
Los procs son geniales para operaciones one shot que requieren mucho rendimiento, pero la parte CRUD es el trabajo de niveles de datos
He creado aplicaciones basadas en procedimientos almacenados en el pasado. En su caso, tal vez haya una manera de mantener la autenticación en la capa de la base de datos y tener su lógica de negocios en C #. Use las vistas para limitar los datos (solo ve las filas a las que tiene autoridad). Estas vistas se pueden usar en LINQ con la misma facilidad que las tablas. Establece que las actualizaciones sucedan con los procedimientos almacenados.
Esto permite linq, lógica de negocio en C # y una capa de autenticación común en la base de datos que controla el acceso a los datos.
Lamentablemente, no hay "una sola respuesta verdadera". La elección que debes hacer depende de múltiples factores, como:
- La familiaridad del equipo con las soluciones dadas (es decir, si la mayoría de ellas se siente cómoda escribiendo SQL, puede estar en la base de datos; sin embargo, si la mayoría de ellas está más cómoda con C #, debería estar en el código)
- El "poder político" de cada parte
- etc
No hay una ventaja decisiva en ninguna dirección (ya que dijo que las ganancias de rendimiento son mínimas), una cosa a tener en cuenta es el principio DRY (No repetir): no vuelva a implementar la funcionalidad dos veces (en el código y en DB), porque mantenerlos sincronizados será una pesadilla. Elija una solución y cúmplala.
Los procedimientos almacenados generalmente son una victoria para la seguridad. La simplificación de la relación entre su aplicación y la base de datos reduce la cantidad de lugares donde puede tener errores; los errores en el código que conectan la lógica de negocios con la base de datos tienden a ser problemas de seguridad. Por lo tanto, su DBA no está equivocado al bloquear las cosas en los procedimientos almacenados.
Otro beneficio de bloquear la aplicación en los procedimientos almacenados es que la conexión de la base de datos de la pila de aplicaciones puede tener sus privilegios bloqueados para llamadas de procedimientos almacenados específicos y nada más.
Un beneficio de tener un DBA involucrado en la lógica de seguridad de su aplicación es que las diferentes funciones y funciones de la aplicación se pueden dividir en la base de datos en vistas, por lo que incluso si se necesitan sentencias SQL dinámicas y de selección genérica, el daño de una vulnerabilidad SQL puede ser restringido
La otra cara de esto es, por supuesto, flexibilidad perdida. Un ORM obviamente va a ser más rápido de desarrollar que una negociación constante con un DBA sobre los parámetros del procedimiento almacenado. Y, a medida que crece la presión sobre esos procedimientos almacenados, es cada vez más probable que los procedimientos recurran a SQL dinámico, que será tan vulnerable como la aplicación compuesta de SQL para atacar.
Hay un punto medio feliz aquí, y deberías tratar de encontrarlo. Trabajé recientemente en proyectos que se salvaron de problemas de inyección de SQL bastante terribles porque un DBA había configurado cuidadosamente la base de datos, sus conexiones y sus procedimientos almacenados para "privilegios mínimos", de modo que cualquier usuario de base de datos solo tuviera acceso a lo que necesitaba saber
Obviamente, a medida que escribe código SQL en la lógica de su aplicación, asegúrese de estar utilizando sistemáticamente declaraciones preparadas parametrizadas, de que está desinfectando su información, de que está atento a la información internacionalizada (hay muchas, muchas formas de decir solo -quote sobre HTTP), y que es consciente de cómo se comporta su base de datos cuando las entradas son demasiado grandes para los anchos de columna.
Mi opinión es que la aplicación en sí debe manejar la autenticación y la autorización. En el lado de la base de datos, solo debe manejar el cifrado de datos según sea necesario.
Podrías hacerlo pero es un gran dolor desarrollar y mantener. Tómelo de alguien que está en un proyecto donde casi toda la lógica de negocios está codificada en procedimientos almacenados.
Por razones de seguridad, ASP.NET tiene una administración de usuario y roles integrada, por lo que es posible que esté guardando viajes a la base de datos, pero ¿y qué? A cambio, se vuelve mucho más molesto manejar y depurar errores de sistema y validación porque tienen que surgir de la base de datos.
Las pruebas unitarias son mucho más difíciles ya que los marcos disponibles para los sprocs de pruebas unitarias están mucho menos desarrollados.
El diseño apropiado de oops y dominio está fuera de la ventana.
Y el aumento en el rendimiento va a ser muy pequeño, en su caso. Hablamos de esto aquí .
Yo recomendaría que si quieres guardar tu cordura como desarrollador, luches con uñas y dientes para mantener la base de datos solo como capa de persistencia
Todo depende de su caso, probablemente sea mejor no ir a la ruta SP y hacer todo el camino DDD (crear un modelo de Dominio en el código y usarlo).
Sin embargo, si tiene una base de datos que no solo es utilizada por su aplicación sino por muchos, probablemente debería considerar los servicios web. De todos modos, la base de datos solo debe ser accesible a través de una capa que haga cumplir las reglas comerciales; de lo contrario, terminarás con datos "sucios" y desinfectar tus datos después es mucho más doloroso que escribir algunas reglas comerciales de antemano. Una buena base de datos debe tener restricciones de verificación e índices establecidos, por lo que tendrá algunas reglas comerciales según lo desee o no.
Y si tiene que lidiar con millones y miles de millones de registros, estará encantado de tener un buen db-guy que resuelva el problema para usted.
No hagas eso . Recientemente tuvimos una MUY MALA experiencia cuando el "gurú de la base de datos" decidió ir a otra compañía. El mantenimiento de toda la lógica en los procedimientos es simplemente horrible.
Sí, vas a tener una mejora en el rendimiento, pero eso no vale la pena. De hecho, el rendimiento ni siquiera es una gran preocupación en la aplicación interna. Invierta más dinero en buenos servidores. Valdrá la pena.