java - 如何保护 Hibernate QBE 查询

标签 java hibernate query-by-example

目前,我知道四种使用 hibernate 进行事务的方式:

  1. 使用对象
  2. 使用 HQL
  3. 使用特定于数据库的 SQL
  4. 使用标准 (QBE)

好吧,关于它们对注入(inject)的抵抗力有多强,我认为这些是(如果我错了请纠正我):

  1. 安全,因为内部 SQL 调用是参数化的。
  2. 如果查询是参数化的则安全,否则不安全。
  3. 与 #2 相同,但不便携。
  4. 没有安全感?

我的问题是关于 #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!

该片段选择了整个帐户表。有什么方法可以防止注入(inject)吗?怎么办?

注意:我使用的是 Hibernate 3.6.5 final,测试数据库是 HSQLDB。

更新:对我来说似乎也是一个错误,而且确实可能​​与注入(inject)的 SQL 无关。尝试使用不存在的值设置 id 并返回所有行。尝试使用 '5'='5' 而不是 '1'='1' 进行注入(inject),并且 5 不会传播到 SQL 调用。它一直使用 (1=1) 作为 where 子句。

更新 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

关于java - 如何保护 Hibernate QBE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746486/

相关文章:

Java 对具有多个参数的对象进行排序

java - 代码在 IDE 内部运行但在外部失败

java.time.Instant -> java.sql.Timestamp 在 Windows 和 *nix 上的行为不同(与时区相关)

java - 为什么我的 ConstraintViolationException 没有被捕获?

view - hive 侧 View ,带有带有1列作为阵列的 hive 表的示例示例

java - 膨胀类 com.tokenautocomplete.ContactsCompletionView 时出错

java - 无法通过 Java 发送 OS X 终端命令

java - 运行我的应用程序的 EntityManager 没有持久性提供程序

MYSQL查询实例(QBE)

nhibernate - NHibernate的示例查询功能是否有很好的文档?