2008-09-22 9 views
9

Los tradicionalistas argumentan que los procedimientos almacenados proporcionan una mejor seguridad que si usa un marco de Mapeo Relacional de Objetos (ORM) como NHibernate.¿Cuáles son las mejores prácticas para implementar seguridad al usar NHibernate?

Para contrarrestar este argumento, ¿cuáles son algunos de los enfoques que se pueden utilizar con NHibernate para asegurar que la seguridad está en su lugar adecuado (por ejemplo, la prevención de la inyección de SQL, etc.)?

(Sírvanse proporcionar sólo una aproximación por respuesta)

Respuesta

3

Utilice un locked-abajo cuenta de SQL dedicada

6

En realidad, NHibernate puede ser vulnerable a la inyección de SQL si utiliza SQL o HQL para construir su consultas. Asegúrate de usar consultas parametrizadas si necesitas hacer esto, de lo contrario te estás preparando para un mundo de dolor.

+0

Supongo que lo que quiere decir es que, en la medida de lo posible, utilice los patrones Criteria y Expression en lugar de HQL. He tenido la impresión de que HQL está parametrizado en sí mismo. ¿Tiene un enlace que muestre cómo se puede usar HQL para inyección? –

+0

HQL está parametrizado. Simplemente no puede concatenar cadenas en su HQL o está haciendo lo mismo que con SQL. –

7

Proteja sus cadenas de conexión.

A partir de .NET 2.0 y NHibernate 1.2, es fácil utilizar 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 en lugar de connection.connection_string. Si está ejecutando un sitio web y no una aplicación de Windows, puede utilizar la herramienta de línea de comandos aspnet_regiis para cifrar el bloque <connectionStrings>, dejando el resto de la configuración de NHibernate en texto plano para facilitar la edición.

Otra estrategia es utilizar la autenticación integrada para la conexión de base de datos, si su plataforma de base de datos compatible con él. De esta forma, (afortunadamente) no está almacenando credenciales en texto plano en su archivo de configuración.

2

Uno de los argumentos que he escuchado en favor de sprocs más de ORM es que ellos 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 :).

usted todavía tiene que protegerse 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 registro de auditoría y copias de seguridad regulares. Si alguien hiciera algo estúpido, siempre se puede recuperar.

+1

+1 Esto es exactamente lo que hubiera dicho, bien puesto (excepto el comentario del spiderman por supuesto: P) – Jay

+0

Eso está bien en el contexto de sentencias SQL autogeneradas, pero aún debe tener cuidado al escribir su propio HQL consultas y seguir las mejores prácticas generales. –

+0

Realmente no estoy seguro de dónde se obtiene la idea de que NHibernate puede escribir mejor sql que un DBA, no soy un DBA, y puedo escribir mejor (más eficiente) SQL que el NHibernate generado SQL. – Martin

1

mango de inyección SQL de más ORM mediante la creación de consultas con parámetros. En NHibernate, si está utilizando LINQ para NHibernate o Criteria/Query sobre los métodos de escritura de consultas, las consultas se parametrizan automáticamente, si crea 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.

Cuestiones relacionadas