security - ¿Cuáles son las mejores prácticas para implementar seguridad al usar NHibernate?
orm data-access (7)
Los tradicionalistas argumentan que los procedimientos almacenados proporcionan una mejor seguridad que si usa un marco de Mapeo Relacional de Objetos (ORM) como NHibernate.
Para contrarrestar ese argumento, ¿cuáles son algunos enfoques que se pueden usar con NHibernate para garantizar que exista una seguridad adecuada (por ejemplo, evitar la inyección de sql, etc.)?
( Proporcione solo un enfoque por respuesta )
Use una cuenta SQL dedicada y bloqueada
En realidad, NHibernate puede ser vulnerable a la inyección SQL si usa SQL o HQL para construir sus consultas. Asegúrate de usar consultas parametrizadas si necesitas hacer esto, de lo contrario te estás preparando para un mundo de dolor.
Proteja sus cadenas de conexión.
A partir de .NET 2.0 y NHibernate 1.2, es fácil usar cadenas de conexión cifradas (y otras configuraciones de aplicaciones) en sus archivos de configuración. Almacene su cadena de conexión en el bloque <connectionStrings>
, luego use la propiedad NHibernate connection.connection_string_name
lugar de connection.connection_string
. Si está ejecutando un sitio web y no una aplicación de Windows, puede usar la herramienta de línea de comandos aspnet_regiis
para encriptar el bloque <connectionStrings>
, mientras deja el resto de su configuración NHibernate en texto plano para facilitar la edición.
Otra estrategia es usar Autenticación integrada para su conexión de base de datos, si su plataforma de base de datos lo admite. De esta forma, (afortunadamente) no está almacenando credenciales en texto plano en su archivo de configuración.
Uno de los argumentos que he escuchado a favor de los sprocs sobre ORM es que no quieren que las personas hagan lo que quieran en la base de datos. No permiten seleccionar / insertar / actualizar / eliminar en las tablas mismas. Cada acción se controla a través de un procedimiento que es revisado por un DBA. Puedo entender de dónde viene este pensamiento ... especialmente cuando tienes muchos aficionados con sus manos en tu base de datos.
Pero los tiempos han cambiado y NHibernate es diferente. Es increíblemente maduro. En la mayoría de los casos, escribirá mejor SQL que tu DBA :).
Todavía tienes que protegerte de hacer algo estúpido. Como Spiderman dice "con gran poder viene una gran responsabilidad"
Creo que es mucho más apropiado dar a NHibernate el acceso adecuado a la base de datos y controlar las acciones a través de otros medios, como el registro de auditoría y las copias de seguridad regulares. Si alguien hiciera algo estúpido, siempre se puede recuperar.
OWASP menciona una forma de vulnerabilidad de inyección SQL en el contexto de las herramientas ORM (y da como ejemplo la inyección HQL): http://www.owasp.org/index.php/Interpreter_Injection#ORM_Injection
La mayoría de los ORM manejan la inyección SQL creando consultas parametrizadas. En NHibernate, si está utilizando LINQ para NHibernate o Criteria / Query sobre los métodos para escribir consultas, las consultas se parametrizan automáticamente; si está creando dinámicamente consultas HQL / SQL usted mismo es más vulnerable y debería tener en cuenta que su las consultas tendrían que ser parametrizadas.