Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保护HibernateQBE查询_Java_Hibernate_Query By Example - Fatal编程技术网

Java 如何保护HibernateQBE查询

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

到目前为止,我知道使用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!
    
    该片段选择整个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)。