我有一个现有的代码,其中应用程序根据很多条件生成不同的sql并通过hibernate会话createSQLQuery()执行它们。在这里,这些参数与作为普通字符串替换驻留在java类中的sql字符串相连接。现在的问题是,我需要防止sql注入。因此,为此,我必须使用getNamedQuery()并绑定参数,以便hibernate将处理特殊字符。但是问题在于将字符串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文件中。
createSqlQuery()
?
:param_name
16.1.7节有示例。