Java 如何保护HibernateQBE查询
到目前为止,我知道使用hibernate进行事务有四种:Java 如何保护HibernateQBE查询,java,hibernate,query-by-example,Java,Hibernate,Query By Example,到目前为止,我知道使用hibernate进行事务有四种: 使用对象 使用HQL 使用特定于数据库的SQL 使用标准(QBE) 那么,关于他们反对注射的力度,我认为这些是(如果我错了,请纠正我): 安全,因为内部SQL调用是参数化的 如果查询是参数化的,则为安全的,否则为不安全的 与#2相同,但不便于携带 不安全 我的问题是关于#4,通过示例进行查询,因为我发现它也很脆弱。例如: Account a = new Account(); //POJO class a.se
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!
该片段选择整个accounts表。有没有办法防止注射?怎么做
注意:我使用的是Hibernate3.6.5Final,测试数据库是HSQLDB
更新:对我来说似乎也是一个bug,实际上可能与注入的SQL无关。尝试使用不存在的值设置id,并返回所有行。尝试使用“5”=“5”而不是“1”=“1”进行注入,但5不会传播到SQL调用。它一直使用(1=1)作为where子句
更新2:已解决。请参阅下面的答案。您可以清理输入,例如,在代码中,您应该确保为ID字段设置了一个长值。Hibernate QBE忽略ID(映射到PK)字段。这样做似乎是因为id筛选器只返回一行,而这可以通过get()或load()实现。我想知道如果我想在id上使用类似的条件会怎么样 hibernate官方论坛相关帖子:
对我来说,这看起来像个虫子。您可能应该将其发布到hibernate。一般来说,HQL/SQL参数化是一种可行的方法(IMHO)。@Adam Gent我知道可以对HQL进行同样的操作,但是QBE没有那么详细,并且您不必检查您不感兴趣的字段的空值。我明白您的观点,但我仍然更喜欢HQL,因为我习惯了SQL,我使用的其他字段也是如此(因此IMHO)。