Injections Dapper et SQL

.net .net-3.5 dapper orm

Question

Comment Dapper aide-t-il à protéger contre les injections SQL? Je teste différentes technologies DAL et je dois en choisir une pour sécuriser notre site. Je m'appuie sur Dapper (http://code.google.com/p/dapper-dot-net/), mais j'ai besoin d'aide pour apprendre la sécurité.

Réponse acceptée

Comment Dapper aide-t-il à protéger contre les injections SQL?

Il est vraiment très facile d’accéder à des données entièrement paramétrées sans avoir à concaténer les entrées. En particulier, parce que vous n'avez pas besoin de sauter par beaucoup de « paramètre ajouter, définissez le type de paramètre, vérifiez null parce que ADO.NET a nul manipulation sucky, rincer / répétition pour 20 paramètres », en faisant gestion des paramètres bêtement pratique . Cela facilite également la transformation des lignes en objets, évitant la tentation d'utiliser DataTable ... tout le monde y gagne.

De commentaires:

Un de plus ... qu'est-ce que Dapper aide réellement à faire alors?

Pour répondre, prenons l'exemple de la réponse de marc_s, et écrivez-le à l'ancienne, en supposant que tout ce dont nous avons besoin est la connection . C'est alors:

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()) {}
    }
}

sauf que j'ai trop simplifié à l'extrême, car il traite également d'un large éventail de questions telles que:

  • null traitement des paramètres
  • Manipulation nulle des colonnes de résultat
  • en utilisant les index des colonnes ordinales
  • adaptation aux changements structurels de la table sous-jacente et du type
  • conversion de données de colonnes de résultats (entre différentes primitives, chaînes, énumérations, etc.)
  • traitement spécial du scénario "in this list" si commun
  • pour "execute", le traitement spécial de "appliquer ceci séparément à une liste d'entrées"
  • éviter les fautes de frappe idiotes
  • réduire la maintenance du code
  • gérer plusieurs grilles
  • gérer plusieurs objets retournés horizontalement dans une seule grille
  • travailler avec des fournisseurs ADO.NET arbitraires (conseil: AddWithValue existe rarement)
    • y compris un support spécifique pour des choses comme Oracle, qui nécessite une configuration supplémentaire
    • joue bien avec les décorations ADO.NET telles que "mini-profileur"
  • support intégré pour les accès en mémoire tampon (adaptés aux données de petite ou moyenne taille; réduit la durée de la commande) et les accès non tampons (adaptés aux données volumineuses; utilisation réduite de la mémoire)
  • optimisé par les personnes soucieuses de performance et qui connaissent «pas mal» l'accès aux données et la méta-programmation
  • vous permet d'utiliser votre choix de POCO / DTO / anon-type / quoi que ce soit à la fois pour le paramètre et la sortie
  • permet d'utiliser soit des dynamic (pour multi-colonnes) ou des primitives, etc. (pour une seule colonne) lorsque la sortie ne justifie pas la génération d'un POCO / DTO
  • éviter la surcharge des ORM complexes entièrement typés comme EF
  • éviter la surcharge des couches faiblement typées comme DataTable
  • ouverture et fermeture des connexions selon les besoins
  • et une vaste gamme d'autres pièges communs

Réponse populaire

Il vous suffit d'utiliser des requêtes paramétrées comme vous le feriez toujours. Étant donné que Dapper est juste une extension "minuscule" (et assez mince) de SQL "brut" et d’ADO.NET, il suffit d’utiliser les requêtes et paramètres ADO.NET paramétrés.

Voir cet exemple du site Dapper-Dot-Net:

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

La requête SQL utilise des paramètres - et vous les fournissez à la requête "Dapper".

Pour résumer: l'utilisation de Dapper en soi ne permet pas de se protéger contre les injections SQL en soi - l'utilisation de requêtes ADO.NET/SQL paramétrées en fait cependant (et ces requêtes sont absolument supportées par Dapper, sans aucun problème)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi