【问题标题】:Prevent SQL injection with Hibernate使用 Hibernate 防止 SQL 注入
【发布时间】:2015-09-27 15:14:34
【问题描述】:

我正在使用 Hibernate,我知道您可以使用 HQL 防止 SQL 注入:

String query1 = "from Obj where id = "+ id;
String query2 = "from Obj where id = :id";

query1 是不安全的,而query2 是安全的。

如何使用 Criteria 实现安全查询?这是否已经实施,还是我必须做其他事情?

Criteria c = session.createCriteria(Obj.class);
c.add(Restrictions.eq("id", 5));

【问题讨论】:

  • 可以通过使用PreparedStatements 和参数化查询在Java 中防止SQL 注入,因为PreparedStatement 会转义不安全的字符,从而使注入攻击无害。 Hibernate 的参数化和标准查询使用PreparedStatements,因此您可以获得开箱即用的 SQL 注入保护。唯一不安全的情况是当您尝试像第一个示例中那样手动编写查询代码时。
  • 在我的示例中,编号 5 可能不安全。如果我从帖子中得到 5,我需要做什么,例如排除“5 和 1 = 1”
  • 这会自动转义,不用担心。要说服自己,请运行测试并确保不会得到意外结果。
  • 我在我的示例应用程序中添加了一个test casetestSQLInjection 方法)来检查对 SQL 注入攻击的保护。如果 SQL 注入有效,此测试将失败,因为使用恶意输入的第二个查询将返回受影响数据库表中的所有行。测试通过的事实证明第二个查询返回零结果,如果输入在发送到数据库之前被正确转义,这是预期的。
  • 谢谢。会运行它。 :)。你为什么不把你的代码贴在下面,这样我就可以接受答案了。

标签: hibernate hibernate-criteria nhibernate-hql


【解决方案1】:

我正在使用 Hibernate,我知道您可以使用 HQL 防止 SQL 注入:

ORM 解决方案(如 hibernate)是 SQL 注入证明的,这是一个非常普遍的误解。 Hibernate 允许使用“原生 SQL”,并定义了一种专有的查询语言,命名为 HQL(Hibernate Query Language);前者容易发生 SQL 注入,而后者容易发生 HQL(或 ORM)注入。 来源:http://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-hibernate

如何使用 Criteria 实现安全查询?

就您的后一个问题而言,Criteria API(类似于 PreparedStatement)对参数进行转义,不会导致恶意 SQL 被执行。

底线是不要将应用程序的参数直接连接到查询中(并使用 Criteria、PreparedStatement),您的应用程序是安全的。

【讨论】:

    【解决方案2】:

    关于 SQL 注入的注意事项:

    既然是热门话题,我现在就说一下,稍后再详细讨论。 Hibernate 不授予对 SQL 注入的免疫力,人们可以随意滥用 api。 HQL(SQL 的 Hibernates 子集)并没有什么特别之处,使其或多或少容易受到影响。

    createQuery(String query) 和 createSQLQuery(String query) 等函数创建一个 Query 对象,该对象将在调用 commit() 时执行。如果查询字符串被污染,则您有 sql 注入。这些函数的详细信息将在后面介绍。

    参考:https://www.owasp.org/index.php/Hibernate

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 2012-12-15
      • 2016-11-16
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多