У меня есть выражение XPath в SQL, которое принимает символы Unicode в качестве входных данных. Мне нужно параметризировать запрос, чтобы предотвратить внедрение SQL.
При передаче символов Unicode они появляются как ?
вместо реальных символов. Таким образом, при передаче строки в качестве параметра в запрос, запрос не возвращает никаких результатов. Фактическая строка - это «abcồn dnưf hiứ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 - Apache OpenJPA.
Когда параметр формы печатается в сервлете, он не распознает символы Юникода (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 f ° f hiá »© j (правильно в формате UTF-8), но все равно запрос не возвращает никаких результатов. ,
Когда я пытаюсь сделать то же самое с помощью PreparedStatement, я получаю результаты. Я сталкиваюсь с проблемой только тогда, когда я использую nativeQuery, но я должен использовать только jpa. Я подозреваю, что мой провайдер jpa не поддерживает символы Юникода.
Может кто-нибудь помочь с этим? Можно ли добавить какое-либо свойство в мой источник данных для поддержки символов UTF-8?