0

我有一个现有代码,其中应用程序根据许多条件生成不同的 sql,并通过休眠会话 createSQLQuery() 执行它们。在这里,参数与驻留在 java 类中的 sql 字符串连接,作为正常的字符串替换。这里的问题是现在我需要防止 sql 注入。因此,为此我必须使用 getNamedQuery() 并绑定参数,以便 hibernate 处理特殊字符。但问题是将字符串 sql's 移动到 xml 文件是一种开销,因为有条件地生成 sql's。所以我决定手动进行特殊字符验证并将其附加到字符串查询并按现在的方式执行。然后我检查了我发现的 PrepareStatement 的来源,它只是抛出了一个异常

byte[] arrayOfByte1 = new byte[0];
try
{
   arrayOfByte1 = CharsToBytes(this.OdbcApi.charSet, arrayOfChar);
}
   catch (UnsupportedEncodingException localUnsupportedEncodingException) {
}

在将参数与字符串查询连接以消除 sql 注入之前,如何在 java 类中对参数进行与上述相同的编码?或者有什么办法我仍然可以保留字符串sql,因为它是一个附加参数并使用hibernate来执行查询?

4

2 回答 2

1

据我所知,您希望动态创建 SQL 查询,因为条件组合(我猜来自 UI)可能非常复杂。没关系。您需要控制的只是用户提供的参数。为此,您可以而且应该仍然使用 Hibernate 的createSqlQuery(). 该函数了解?位置参数(从查询字符串的开头编号)或:param_name语法,然后您提供命名参数。您不需要将任何内容移动到 xml 文件中。

第 16.1.7 节有示例。

于 2013-05-29T07:07:13.177 回答
0

如果您需要将自定义 SQL 组装到查询中,我发现编写自己的包含自定义 SQL 的条件类效果很好。

您只需要实现 Criterion 接口。 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/criterion/Criterion.html

(另见“非空”的休眠实现:http: //www.grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.4.sp1/org/hibernate/criterion/ NotNullExpression.java?av=f .)

然后,您可以使用普通的休眠条件 API 简单地构建每个自定义查询。

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-creating

正确清理 SQL 值是很痛苦的——尽量避免它!;-)

于 2013-05-30T21:43:34.940 回答