繁体   English   中英

使用Hibernate防止SQL注入

[英]SQL injection prevention with hibernate

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

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

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

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

16.1.7节有示例。

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

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

(另请参见“非空”的Hibernate实现: 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值很痛苦-尽力避免它! ;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM