flawopen.com/SQL Injection em C#/NHibernate
O NHibernate protege contra SQL Injection?
Um parâmetro vinculado é como um cartão lacrado em um formulário: o banco trata o valor como dado, não como instrução. Parâmetros HQL criam essa separação. Interpolar texto não confiável em HQL ou SQL o transforma novamente em linguagem 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>();
Vincule valores; limite a estrutura da consulta
SetParameter() envia o valor separado do texto HQL. Use parâmetros nomeados ou posicionais para valores não confiáveis. Consultas SQL nativas também aceitam parâmetros nomeados e posicionais; use o método de vinculação correspondente de ISQLQuery (por exemplo, SetString() para valores de texto). Parâmetros não representam nomes de entidades ou propriedades, ordenação ou fragmentos de consulta; isso é estrutura. Se o usuário puder escolher uma propriedade, mapeie a opção para fragmentos HQL fixos definidos pela aplicação. A parametrização evita que valores virem sintaxe, mas não verifica se a pessoa está autorizada a acessar os registros.
Perguntas frequentes
Não. A vinculação protege a sintaxe contra valores; a autorização ainda deve limitar a consulta aos registros acessíveis à pessoa, por exemplo, filtrando pela conta ou tenant autenticado.
Referências
- Referência do NHibernate — HQL: Hibernate Query Language
- Referência do NHibernate — SQL nativo
- OWASP — Prevenção de SQL Injection
- flawopen.com — SQL Injection em C#