【问题标题】:SQL Injection through Hibernate-Criteria & Session.save(object)通过 Hibernate-Criteria 和 Session.save(object) 注入 SQL
【发布时间】:2012-04-12 11:45:12
【问题描述】:

为了避免 sql 注入,通常可以在 HQL 中使用 位置参数命名参数,因为它演示了 here,stackoverflow 也有示例。我想知道使用Criteria 时可以采取哪些步骤。请提供有关示例代码或有用链接的任何帮助。

编辑
还有当我们保存一个对象时呢?比方说,该对象可能有一个字符串变量,并且有人可以为它分配一个易受攻击的 sql 查询。

 myObject.setName(somevulnerablesql); session.save(myObject); 

在这种情况下,我们是否必须在分配给对象之前单独检查用户输入?或任何其他避免此类 sql 注入的步骤?

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    我很确定 Criteria-Object 将创建安全的 HSQL。

    您必须小心Expression 对象。你可以在那里创建一个 SQL 注入。 但是看看生成的SQL:Hibernate show real SQL

    编辑: 除非 Hibernate 中存在巨大的错误,否则您不必确保在保存 Strings 之前已对其进行了转义。 Hibernate 使用准备好的语句。因此,Hibernate 会话没有字符串连接和 SQL 注入。

    但是在使用 Hibernate 读取输出后,您可能必须转义输出。例如: 你有一个实体用户

    class User{
        String name;
    }
    

    而你调用用户"' or 1=1;DROP DATABASE user;--" 那个字符串将被存储在数据库中。 如果您使用 Criterion 对象查询用户,您会找到他(不删除数据库)。如果您使用 Expression 对象查询用户,您可能会删除数据库(如果您连接字符串)。

    如果您将用户名输出到 HTML,您必须对输出进行转义。否则名称为 "/><script>evilJavascript()</script> 的用户将对您的应用程序不利。

    编辑 2: 看这里:https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

    【讨论】:

      【解决方案2】:

      标准不允许您自己编写易受攻击的 SQL/HQL,因此 SQL 注入应该没有任何问题(除非 Hibernate 本身存在错误)。

      编辑

      正如@ckuetbach 指出的那样,Criteria 实际上允许您使用Expression.sql(String sql)Restrictions.sqlRestriction(String) 编写SQL。

      【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2013-02-10
      • 1970-01-01
      • 2017-03-14
      • 2016-06-30
      • 2016-03-05
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多