如何保护 Hibernate QBE 查询
Posted
技术标签:
【中文标题】如何保护 Hibernate QBE 查询【英文标题】:How to secure Hibernate QBE query 【发布时间】:2011-10-08 10:58:06 【问题描述】:目前,我知道四种用hibernate做事务:
-
使用对象
使用 HQL
使用特定于数据库的 SQL
使用标准 (QBE)
嗯,关于它们对注射的抵抗力有多强,我认为这些是(如果我错了,请纠正我):
-
安全,因为内部 SQL 调用是参数化的。
如果查询是参数化的,则安全,否则不安全。
与 #2 相同,但不便携。
不安全?
我的问题是关于#4,Query by Example,因为我发现它也很容易受到攻击。示例:
Account a = new Account(); //POJO class
a.setId("1' OR '1'='1");
//s is a org.hibernate.Session instance
Criteria crit = s.createCriteria(Account.class);
crit.add(Example.create(a));
List results = crit.list(); //table dump!
sn-p 选择整个帐户表。有什么方法可以防止注射吗?怎么样?
注意:我使用的是 Hibernate 3.6.5 final,测试数据库是 HSQLDB。
更新:对我来说似乎也是一个错误,实际上可能与注入的 SQL 无关。尝试使用不存在的值设置 id 并返回所有行。尝试使用 '5'='5' 而不是 '1'='1' 进行注入,并且 5 不会传播到 SQL 调用。它一直使用 (1=1) 作为 where 子句。
更新 2:已解决。请参阅下面的答案。
【问题讨论】:
这对我来说似乎是一个错误。您可能应该将其发布到休眠状态。一般来说,HQL/SQL 参数化是可行的方法(恕我直言)。 @Adam Gent 我知道对 HQL 也可以这样做,但 QBE 不那么冗长,而且您不必检查您不感兴趣的字段的无效性。 我明白你的意思,但我仍然更喜欢 HQL,因为我习惯了 SQL,我使用的其他人也是如此(因此恕我直言)。 【参考方案1】:您可以清理您的输入,例如在您的代码中,您应该确保为 ID 字段设置了 Long 值。
【讨论】:
【参考方案2】:Hibernate QBE 忽略 id(映射到 PK)字段。似乎这样做是因为 id 过滤器只会返回一行,这可以通过 get() 或 load() 来实现。我想知道如果我想在 id 上使用 like 条件怎么办???
hibernate官方论坛相关帖子:
https://forum.hibernate.org/viewtopic.php?t=927063
https://forum.hibernate.org/viewtopic.php?t=938036
【讨论】:
以上是关于如何保护 Hibernate QBE 查询的主要内容,如果未能解决你的问题,请参考以下文章