目前,我知道四种使用 hibernate 进行事务处理的方式:
- 使用对象
- 使用HQL
- 使用特定于数据库的 SQL
- 使用标准 (QBE)
好吧,关于它们对注射的抵抗力有多强,我认为是这些(如果我错了,请纠正我):
- 安全,因为内部 SQL 调用是参数化的。
- 如果查询被参数化,则安全,否则不安全。
- 与#2 相同,但不那么便携。
- 没有安全感?
我的问题是关于#4,通过示例查询,因为我发现它也很容易受到攻击。例子:
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!
该片段选择整个帐户表。有什么办法可以防止注射吗?如何?
注意:我使用的是 Hibernate 3.6.5 Final,测试数据库是 HSQLDB。
更新:对我来说似乎也是一个错误,实际上可能与注入的 SQL 无关。尝试使用不存在的值设置 id 并返回所有行。尝试使用 '5'='5' 而不是 '1'='1' 进行注入,并且 5 不会传播到 SQL 调用。它继续使用 (1=1) 作为 where 子句。
更新2:已解决。请参阅下面的答案。
Hibernate QBE 忽略 id(映射到 PK)字段。似乎这样做是因为 id 过滤器只会返回一行,这可以通过 get() 或 load() 来实现。我想知道如果我想在 id 上使用类似条件怎么办???
hibernate官方论坛相关帖子:
https://forum.hibernate.org/viewtopic.php?t=927063 https://forum.hibernate.org/viewtopic.php?t=927063
https://forum.hibernate.org/viewtopic.php?t=938036 https://forum.hibernate.org/viewtopic.php?t=938036
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)