web-dev-qa-db-fra.com

Entity Framework + injection SQL

Je crée un IQueryable où j'applique des filtres pertinents, et je tombe sur cette ligne de code ici.

items = items.OrderBy(string.Format("{0} {1}", sortBy, sortDirection));

Cet extrait est-il vulnérable à l'injection SQL? Ou ces paramètres (chaîne) sont-ils paramétrés en arrière-plan? J'ai supposé que toutes les requêtes Linq avaient été échappées et paramétrées pour moi, mais le fait que je puisse passer directement une chaîne comme celle-ci me décourage.

9
alexhuang

Premier point:

Vous devez éviter de renvoyer les types IQueryable<T> À partir de méthodes exposées à des appelants potentiellement non fiables pour les raisons suivantes:

  • Un consommateur d'une requête qui expose un type IQueryable<T> Pourrait appeler des méthodes sur le résultat qui exposent des données sécurisées ou augmenter la taille de l'ensemble de résultats. Par exemple, considérez la signature de méthode suivante:

    public IQueryable<Customer> GetCustomer(int customerId)

Un consommateur de cette requête pourrait appeler .Include("Orders") sur le IQueryable<Customer> Renvoyé pour récupérer les données que la requête n'avait pas l'intention d'exposer. Cela peut être évité en modifiant le type de retour de la méthode en IEnumerable<T> Et en appelant une méthode (telle que .ToList()) qui matérialise les résultats.

  • Étant donné que les requêtes IQueryable<T> Sont exécutées lorsque les résultats sont itérés, un consommateur d'une requête qui expose un type IQueryable<T> Peut intercepter les exceptions levées. Exceptions peut contenir des informations non destinées au consommateur.

Deuxième point:

Comment empêcher les attaques par injection SQL?

  • Attaques par injection SQL d'entité:

Les attaques par injection SQL peuvent être effectuées dans Entity SQL en fournissant malicious input Aux valeurs utilisées dans un query predicate Et dans parameter names.

À éviter le risque d'injection SQL

vous ne devez jamais combiner la saisie utilisateur avec le texte de commande Entity SQL

Entity SQL interroge accept parameters Partout où les littéraux sont acceptés. Vous devez utiliser des requêtes paramétrées au lieu d'injecter des littéraux d'un agent externe directement dans la requête. Vous devez également envisager en utilisant des méthodes de générateur de requête pour construire en toute sécurité Entity SQL.

  • Attaques par injection LINQ to Entities:

Bien que la composition de requêtes soit possible dans LINQ to Entities, elle est effectuée via l'API de modèle d'objet. Contrairement aux requêtes Entity SQL, les requêtes LINQ to Entities ne sont pas composées à l'aide de la manipulation ou de la concaténation de chaînes et elles ne sont pas sensibles aux attaques par injection SQL traditionnelles.

Référence: Considérations de sécurité (Entity Framework) =

19
Sampath