flawopen.com/Injection SQL en C#/NHibernate
NHibernate protège-t-il contre les injections SQL ?
Un paramètre lié ressemble à une fiche scellée dans un formulaire : la base traite la valeur comme une donnée, pas comme une instruction. Les paramètres HQL séparent les valeurs. Interpoler du texte non fiable dans HQL ou SQL le réintroduit dans le langage de requête.
var hql =
$"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
.UniqueResult<User>();
var user = session.CreateQuery(
"from User u where u.Id = :id")
.SetParameter("id", userId)
.UniqueResult<User>();
Lier les valeurs ; contrôler la structure de la requête
SetParameter() transmet la valeur séparément du texte HQL. Utilisez des paramètres nommés ou positionnels pour toute valeur non fiable. Les requêtes SQL natives prennent aussi en charge les paramètres nommés et positionnels ; utilisez la méthode de liaison correspondante de ISQLQuery (par exemple, SetString() pour les valeurs textuelles). Ils ne représentent ni noms d’entités ou de propriétés, ni ordre de tri, ni fragments de requête : ce sont des éléments structurels. Si l’utilisateur peut choisir une propriété, associez son choix à des fragments HQL fixes définis par l’application. Le paramétrage sépare données et syntaxe, mais ne décide pas des droits d’accès aux enregistrements.
FAQ
Non. Les paramètres protègent la syntaxe des valeurs ; l’autorisation doit limiter la requête aux enregistrements accessibles à l’utilisateur, par exemple avec un filtre sur son compte ou tenant authentifié.
Références
- Référence NHibernate — HQL: Hibernate Query Language
- Référence NHibernate — SQL natif
- OWASP — Prévention des injections SQL
- flawopen.com — Injection SQL en C#