Dapper y SQL Inyecciones

.net .net-3.5 dapper orm

Pregunta

¿Cómo ayuda Dapper a proteger contra las inyecciones de SQL? Estoy probando diferentes tecnologías DAL y tengo que elegir una para asegurar nuestro sitio. Me inclino por Dapper (http://code.google.com/p/dapper-dot-net/), pero necesito ayuda para aprender sobre seguridad.

Respuesta aceptada

¿Cómo ayuda Dapper a proteger contra las inyecciones de SQL?

Hace realmente, realmente fácil hacer acceso a datos totalmente parametrizado, sin necesidad de concatenar ninguna entrada. En particular, debido a que no necesita saltar a través de "agregar parámetro, configure el tipo de parámetro, verifique nulo porque ADO.NET tiene sucky null-handling , enjuague / repita para 20 parámetros", al hacer el manejo de los parámetros estúpidamente conveniente . También hace que convertir filas en objetos sea realmente fácil, evitando la tentación de usar DataTable ... todos ganan.

De los comentarios:

Una más ... ¿qué hace Dapper realmente ayudar a hacer eso?

Para responder, tomemos el ejemplo de la respuesta de marc_s, y escríbalo a la antigua, suponiendo que todo lo que tenemos que comenzar es la connection . Esto es entonces:

List<Dog> dogs = new List<Dog>();
using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "select Age = @Age, Id = @Id";
    cmd.Parameters.AddWithValue("Age", DBNull.Value);
    cmd.Parameters.AddWithValue("Id", guid);
    using(var reader = cmd.ExecuteReader()) {
        while(reader.Read()) {
            int age = reader.ReadInt32("Age");
            int id = reader.ReadInt32("Id");
            dogs.Add(new Dog { Age = age, Id = id });
        }
        while(reader.NextResult()) {}
    }
}

excepto que he simplificado demasiado, ya que también se ocupa de una amplia gama de cuestiones tales como:

  • nulo manejo de parámetros
  • manejo nulo de columnas de resultados
  • utilizando los índices de columnas ordinales
  • adaptándose a los cambios estructurales de la tabla subyacente y tipo
  • conversión de datos de columnas de resultados (entre varias primitivas, cadenas, enumeraciones, etc.)
  • manejo especial del escenario "en esta lista" tan común
  • para "ejecutar", manejo especial de "aplicar esto por separado a una lista de entradas"
  • evitando errores tipográficos
  • reduciendo el mantenimiento del código
  • manejando múltiples rejillas
  • manejo de objetos múltiples devueltos horizontalmente en una sola grilla
  • trabajando con proveedores arbitrarios de ADO.NET (pista: AddWithValue rara vez existe)
    • incluyendo soporte específico para cosas como Oracle, que necesita configuración adicional
    • se juega muy bien con decoratos ADO.NET como "mini-profiler"
  • soporte integrado para accesos búfer (adecuado para datos pequeños a moderados, minimiza la duración del comando) y no bufferesd (adecuado para datos grandes, uso de memoria minimizado)
  • optimizado por personas que se preocupan por el rendimiento y saben "bastante" sobre el acceso a los datos y la metaprogramación
  • le permite usar su opción de POCO / DTO / anon-type / whatever para el parámetro y la salida
  • permite el uso de dynamic (para múltiples columnas) o primitivas, etc. (para una sola columna) cuando la salida no garantiza la generación de un POCO / DTO
  • evitar la sobrecarga de ORM complejos de tipo completo como EF
  • evitar la sobrecarga de capas de tipo débil como DataTable
  • abrir y cerrar conexiones según sea necesario
  • y una amplia gama de otras trampas comunes

Respuesta popular

Solo necesita utilizar consultas parametrizadas como siempre debería. Dado que Dapper es solo una extensión "pequeña" (y bastante delgada) para SQL "en bruto" y ADO.NET, solo use consultas parametrizadas de ADO.NET y parámetros de suministro.

Vea este ejemplo del sitio Dapper-Dot-Net:

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", 
                                new { Age = (int?)null, Id = guid });

La consulta SQL usa parámetros, y los suministra a la consulta "Dapper".

Para resumir: el uso de Dapper en sí mismo no ayuda a proteger contra las inyecciones de SQL per se - utilizando consultas parametrizadas ADO.NET/SQL, sin embargo (y esas consultas son totalmente compatibles con Dapper, sin problemas)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué