flawopen.com/C# 中的 SQL 注入/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 查询也支持命名和位置参数;应使用 ISQLQuery 中对应的绑定方法(例如,字符串值使用 SetString())。参数不能代表实体名、属性名、排序方向或查询片段;这些属于查询结构。可选属性应映射到应用代码中的固定 HQL 片段集合。参数化能避免数据被当作语法解析,但不能决定用户是否有权访问这些记录。
常见问题
为 HQL 参数化也会授权访问记录吗?
不会。参数绑定保护查询语法不受数据值影响;授权仍须将查询限制在当前用户有权访问的记录范围内,例如按已认证账户或租户过滤。