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.
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.
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.Comment empêcher les attaques par injection SQL?
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.
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) =