flawopen.com/SQL-инъекция в C#/NHibernate
Защищает ли NHibernate от SQL-инъекций?
Связанный параметр похож на запечатанную карточку в форме запроса: база воспринимает его как данные, а не команду. Параметры HQL отделяют значения. Интерполяция недоверенного текста в HQL или SQL снова превращает его в часть языка запросов.
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>();
Связывайте значения; ограничивайте структуру запроса
SetParameter() передаёт значение отдельно от текста HQL. Используйте именованные или позиционные параметры для недоверенных значений. Нативные SQL-запросы также поддерживают именованные и позиционные параметры; используйте соответствующий метод привязки API ISQLQuery (например, SetString() для строковых значений). Параметры не предназначены для имён сущностей и свойств, сортировки или фрагментов: это структура запроса. Сопоставляйте выбираемое свойство с фиксированным набором фрагментов HQL приложения. Параметризация отделяет данные от синтаксиса, но не определяет право доступа пользователя к записям.
Вопросы и ответы
Нет. Параметры защищают синтаксис от значений; авторизация должна ограничивать запрос доступными текущему пользователю записями, например, по его учётной записи или tenant.
Источники
- Справочник NHibernate — HQL: Hibernate Query Language
- Справочник NHibernate — Native SQL
- OWASP — предотвращение SQL-инъекций
- flawopen.com — SQL-инъекция в C#