通过Hibernate-Criteria和Session.save(对象)进行SQL注入

Déb*_*ora 5 java sql hibernate

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

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

 myObject.setName(somevulnerablesql); session.save(myObject); 
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ach 4

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

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

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

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

class User{
    String name;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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