如何保护Hibernate QBE查询

时间:2011-07-19 11:35:07

标签: java hibernate query-by-example

到目前为止,我知道有四种与hibernate进行交易:

  1. 使用对象
  2. 使用HQL
  3. 使用特定于DB的SQL
  4. 使用标准(QBE)
  5. 那么,关于它们对注射的强度有多强,我认为这些(如果我错了,请纠正我):

    1. 安全,因为内部SQL调用已参数化。
    2. 如果查询已参数化,则为安全,否则为不安全。
    3. 与#2相同但不便携。
    4. 不安全?
    5. 我的问题是关于#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:解决了。请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

Hibernate QBE忽略id(映射到PK)字段。似乎这样做是因为id过滤器只返回一行,这可以通过get()或load()来实现。我想知道如果我想在id ???

上使用类似的条件

hibernate官方论坛上的相关帖子:

https://forum.hibernate.org/viewtopic.php?t=927063

https://forum.hibernate.org/viewtopic.php?t=938036

答案 1 :(得分:0)

您可以清理您的输入例如。在您的代码中,您应该确保为ID字段设置Long值。