flawopen.com/SQL Injection en C#/NHibernate
¿NHibernate protege frente a SQL Injection?
Un parámetro enlazado es como una ficha sellada en un formulario: la base de datos lo trata como dato, no como instrucción. Los parámetros HQL separan los valores. Interpolar texto no confiable en HQL o SQL vuelve a convertirlo en lenguaje de consulta.
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>();
Enlaza valores; limita la estructura de la consulta
SetParameter() envía el valor por separado del texto HQL. Usa parámetros con nombre o posicionales para cada valor no confiable. Las consultas SQL nativas también admiten parámetros con nombre y posicionales; usa el método de enlace correspondiente de ISQLQuery (por ejemplo, SetString() para valores de texto). No representan nombres de entidades o propiedades, orden ni fragmentos de consulta: eso es estructura. Si el usuario puede elegir una propiedad, asigna su opción a fragmentos HQL fijos controlados por la aplicación. Parametrizar evita confundir datos con sintaxis, pero no determina si el usuario tiene permiso para acceder a los registros.
Preguntas frecuentes
No. Los parámetros protegen la sintaxis frente a los valores; la autorización debe limitar la consulta a registros accesibles para el usuario, por ejemplo, filtrando por cuenta o tenant autenticado.
Referencias
- Referencia NHibernate — HQL: Hibernate Query Language
- Referencia NHibernate — SQL nativo
- OWASP — Prevención de SQL Injection
- flawopen.com — SQL Injection en C#