MySQL обнаруживает ключевые слова в подготовленном операторе

Мой код работает, поэтому я чувствую себя грязным, задавая этот вопрос, но, похоже, я не могу найти нигде, используя такую ​​же технику, поэтому хочу спросить, есть ли в нем что-то явно неправильное, чего я не вижу.

У меня есть хранимая процедура, в которой один входной параметр решает, какие поля возвращать, помещая его между SELECT и FROM ... в подготовленном операторе - я предполагаю, что это подвержено SQL-инъекции, поэтому я сканировал переменную, чтобы отклонить что-либо, если Параметр включает любые опасные ключевые слова или разделители:

Здесь x может быть table1.col1, table1.col4, table2.col1

IF LOCATE('DROP', x) > 0 OR LOCATE('INSERT', x) > 0 OR LOCATE('UPDATE', x) > 0
    OR LOCATE(';', x) > 0 OR LOCATE('DELETE', x) > 0 THEN

Я упустил что-то большое? Или, может быть, есть готовый способ сделать это в MySQL?

Что, если x равно table1.dateINSERTion? Ваш тест определит его местонахождение ... Лучше (но далеко не идеально) вставить такой пробел, как этот IF LOCATE('INSERT ', x) > 0

didier2l 23.04.2018 15:56

Функция MySQL PREPARE не может обрабатывать несколько операторов SQL, поэтому вектор внедрения с точкой с запятой (;) не поможет злоумышленнику. sqlfiddle.com/#!9/5b8011

Raymond Nijland 23.04.2018 15:59

Спасибо, ребята, очень полезно, я знал о словах внутри слов, которые могут быть заблокированы, у меня был INSERT с пробелом в какой-то момент, и я беспокоился, что вам не всегда нужен пробел после INSERT, но, насколько я понимаю, единственное, что должно быть включено, - это имена полей / таблиц, которые я определяю, так что все должно быть в порядке. Полезно знать, что ; тоже не нужен.

jamheadart 23.04.2018 17:41
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не существует "готового" способа, но регулярные выражения упростят ваш код:

where x regexp 'DROP|INSERT|UPDATE|;|DELETE'

Я не уверен, что это действительно то, что вам нужно. Он найдет PREINSERTION и DELETING. Но это проще и равносильно вашей логике.

Я приму это как принятый ответ, поскольку он состоит из одной строки, и я могу легко добавить еще несколько предупреждающих слов, если это необходимо.

jamheadart 23.04.2018 17:42

Другие вопросы по теме