FlawOpen

flawopen.com/SQL-инъекция в C#/NHibernate

Защищает ли NHibernate от SQL-инъекций?

Справочное руководство
Краткий ответ

Связанный параметр похож на запечатанную карточку в форме запроса: база воспринимает его как данные, а не команду. Параметры HQL отделяют значения. Интерполяция недоверенного текста в HQL или SQL снова превращает его в часть языка запросов.

НЕБЕЗОПАСНО — интерполяция ввода в HQL
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
ЗАЩИЩЕНО — передача значения через параметр HQL
var user = session.CreateQuery(
    "from User u where u.Id = :id")
  .SetParameter("id", userId)
  .UniqueResult<User>();

Связывайте значения; ограничивайте структуру запроса

SetParameter() передаёт значение отдельно от текста HQL. Используйте именованные или позиционные параметры для недоверенных значений. Нативные SQL-запросы также поддерживают именованные и позиционные параметры; используйте соответствующий метод привязки API ISQLQuery (например, SetString() для строковых значений). Параметры не предназначены для имён сущностей и свойств, сортировки или фрагментов: это структура запроса. Сопоставляйте выбираемое свойство с фиксированным набором фрагментов HQL приложения. Параметризация отделяет данные от синтаксиса, но не определяет право доступа пользователя к записям.

Вопросы и ответы

Даёт ли параметризация HQL право доступа к записи?

Нет. Параметры защищают синтаксис от значений; авторизация должна ограничивать запрос доступными текущему пользователю записями, например, по его учётной записи или tenant.

Источники

См. также SQL-инъекции (CWE-89): как они работают и как их предотвратить в любом языке — flawopen.com NoSQL-инъекция в MongoDB: безопасные фильтры SQL Injection при числовых ID: риск? Что такое параметризованный запрос? Защищает ли Prisma $queryRaw от SQL-инъекций? Безопасна ли интерполяция в Rails where()? Защищает ли Sequelize query() от SQL-инъекций?