FlawOpen

flawopen.com/Injection SQL en C#/NHibernate

NHibernate protège-t-il contre les injections SQL ?

Guide de référence
Réponse courte

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.

NON SÛR — interpoler l’entrée dans HQL
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
RENFORCÉ — lier la valeur au paramètre HQL
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

Le paramétrage HQL autorise-t-il aussi l’accès à un enregistrement ?

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

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com Injection NoSQL MongoDB : filtres sûrs Un ID numérique peut-il aussi provoquer une injection SQL ? Qu'est-ce qu'une requête paramétrée ? Prisma $queryRaw protège-t-il contre les injections SQL ? L’interpolation dans where() de Rails est-elle sûre ? Sequelize query() protège-t-il contre les injections SQL ?