5

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

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

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

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

4

2 回答 2

4

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

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

编辑: 除非 Hibernate 中存在巨大的错误,否则您不必确保String在保存它们之前您的 s 已被转义。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

于 2012-04-12T11:52:21.467 回答
3

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

编辑

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

于 2012-04-12T11:50:07.850 回答