SQL注入通过Hibernate-Criteria& Session.save(对象)

时间:2012-04-12 11:45:13

标签: java sql hibernate

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

修改
当我们保存一个对象时呢?比方说,该对象可能有一个String变量,有些人可以为它分配一个易受攻击的SQL查询。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

修改 除非Hibernate中存在巨大的错误,否则您无需确保在保存之前对String进行转义。 Hibernate使用预处理语句。所以没有字符串连接,也没有Hibernate会话的SQL注入。

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

class User{
    String name;
}

并且您调用用户“'或1 = 1; DROP DATABASE用户; - ”该字符串将存储在数据库中。 如果您使用Criterion对象查询用户,您将找到他(删除数据库)。如果使用Expression对象查询User,则可以删除数据库(如果您使用Strings)。

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

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

答案 1 :(得分:3)

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

修改

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