FlawOpen

flawopen.com/SQL Injection em C#/NHibernate

O NHibernate protege contra SQL Injection?

Guia de referência
Resposta curta

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.

INSEGURO — interpolar entrada em HQL
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
PROTEGIDO — vincular valor ao parâmetro HQL
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

Parametrizar HQL também autoriza acesso a um registro?

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

Veja também SQL Injection (CWE-89): como funciona e como evitar em todas as linguagens — flawopen.com MongoDB NoSQL Injection: filtros de consulta seguros String de IDs numéricos também pode causar SQL Injection? O que é uma consulta parametrizada? Prisma $queryRaw: é seguro contra SQL Injection? Interpolação em where() do Rails é segura? Sequelize query() é seguro contra SQL Injection?