我在SQL中有一个XPath表达式,该表达式将Unicode字符作为输入。我需要参数化查询以防止SQL注入。
传递Unicode字符时,它们以?
的形式出现,而不是实际的字符。因此,将字符串作为参数传递给查询时,查询不会返回任何结果。实际的字符串是“abcồndnưfhiứj”,它是用户从表单中输入的内容,但是当作为参数传递给查询时,Unicode字符将被?
替换,如下所示。
declare @name NVARCHAR(100)=?;
SELECT
*
FROM
dbo.EMPLOYEE_DETAILS
WHERE
EMPLOYEE_DETAILS.EMP_XML.value('(/map/name)[1]', 'nvarchar(max)') like @name
在JPA中打印查询时,参数的打印如下。
[params=(String) %abc?n de?f hi?j%]
添加更多详细信息。
使用的服务器是WebSphere Application Server 8.5,而JPA Provider是Apache OpenJPA。
在servlet中打印form参数时,它无法识别unicode字符(abcễn像abc?n一样被打印)。上面的nativeQuery没有返回任何结果,因为数据库中没有像abc?n这样的字符串。因此,我在web.xml中添加了以下条目,并在Websphere Application Server中添加了以下属性。
自定义属性:
client.encoding.override = UTF-8 file.encoding = UTF-8
Web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
添加此条目后,当我打印字符串时,它们以utf-8编码打印,例如abcồdnÆ°fhiứj(正确为UTF-8格式),但查询仍未返回任何结果。
当我使用PreparedStatement尝试相同的操作时,会得到结果。我仅在使用nativeQuery时才遇到此问题,但我只能使用jpa。我怀疑我的jpa提供程序不支持unicode字符。
有人可以帮忙吗?是否有任何属性可以添加到我的数据源中以支持UTF-8字符?