Запретить подстановочный знак SQL - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть приложение, которое позволяет пользователю вводить свой SQL с оператором LIKE, а также по крайней мере один заполнитель для динамического параметра, например:

SELECT * FROM Usergroups WHERE Username LIKE ?; 

В бэкэнде он создает PreparedStatements и установите этот параметр на основе текущего имени пользователя из информации для входа в систему. Если кто-то может зарегистрировать подстановочное имя, такое как%, то он может просматривать все группы пользователей.

Существует ли какой-либо стандартный метод для предотвращения такого внедрения SQL-символов подстановки?Как я должен санировать входной SQL или параметр?

Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Если вы не хотите разрешать символы подстановки при сравнении строк, самое простое решение - избегать использования LIKE и вместо этого использовать =:

WHERE Username = 'The 7% Solution'

Стандартное поведение SQL LIKE, который должен работать в любой реализации SQL, - это экранировать подстановочный знак, поставив перед ним символ экранирования.Вы можете выбрать символ, который должен использоваться в качестве escape-символа, но по какой-то причине в документации часто приводится пример @, вероятно, только потому, что этот символ редко используется в текстовых шаблонах.

WHERE Username LIKE 'The 7@% Solution' ESCAPE '@'

Если вам нужно включить буквальный символ, который совпадает с вашим escape-символом, удвойте символ в шаблоне, тогда он соответствует одному буквенному символу.

WHERE Username LIKE 'Seti@@Home' ESCAPE '@'

Некоторые реализации SQL, например MySQL (см. LIKE в документах MySQL ), допустим, что управляющий символ по умолчанию равен \:

WHERE Username LIKE 'The 7\% Solution'

Но другие бренды не определяют управляющий символ по умолчанию, например Oracle.См. LIKE в документации Oracle .Вы должны указать предложение ESCAPE, иначе для групповых символов невозможно экранирование.

Microsoft SQL Server добавляет нестандартное сопоставление с шаблоном в предикат LIKE, поэтому вы можете искать диапазоны символов.Вы можете сделать подстановочный знак похожим на буквальный символ, заключив его в квадратные скобки, как будто это диапазон из одного символа.См. LIKE Transact-SQL .

WHERE Username LIKE 'The 7[%] Solution'

Извините, ответ на ваш вопрос не является полностью непротиворечивым от одной базы данных SQL к другой.

...