如何保护 Hibernate QBE 查询的安全

发布于 2024-11-25 04:18:46 字数 862 浏览 1 评论 0原文

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

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

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

  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!

该片段选择整个帐户表。有什么办法可以防止注射吗?如何?

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

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

更新2:已解决。请参阅下面的答案。

By the moment, I know four kinds of doing transactions with hibernate:

  1. Using objects
  2. Using HQL
  3. Using DB-specific SQL
  4. Using criteria (QBE)

Well, regarding how strong are they against injections, I think these are (correct me if I'm wrong):

  1. Secure, because the internal SQL call is parameterized.
  2. Secure if the query is parameterized, insecure otherwise.
  3. Same as #2 but not as portable.
  4. Insecure?

My question is about #4, Query by Example, because i've found it is also vulnerable. Example:

    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!

That snippet selects the whole accounts table. Is there any way to prevent injection? How?

NOTE: I'm using Hibernate 3.6.5 final, the testing database is HSQLDB.

UPDATE: Seems like a bug to me too, and indeed may be not related to the injected SQL. Tried setting the id with a nonexistent value and also returns all the rows. Tried the injection with '5'='5' instead of '1'='1' and the 5 is not propagated to the SQL call. It keeps using (1=1) as where clause.

UPDATE 2: Solved. See the answer below.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长不大的小祸害 2024-12-02 04:18:46

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

Hibernate QBE ignores the id (mapped to PK) fields. Seems that this is done because an id filter would return only a row, and this can be achieved with a get() or a load(). I wonder what if I want to use a like condition on the id???

Related posts on hibernate official forum:

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

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

无声静候 2024-12-02 04:18:46

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

You can sanitize your input E.g. in your code you should make sure you set a Long value to the ID field.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文