Задать вопрос
@SAPER0V

Как сделать кастомный mysql запрос от пользователя?

Привет! Я хочу написать кастомную фукнцию, в которую будет попадать введённый запрос от пользователя, а функция в свою очередь будет проверять на разные подвохи, по типу инъекций и всего прочего.

Например, юзер вводит запрос в инпут : count > 1 AND Name = Dima OR name = Andrey , функция переводит этот вопрос в SELECT * FROM database WHERE count > 1 AND Name = Dima OR name = Andrey; Пытаясь убрать mysql инъекции.
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Есть два варианта.

Классифицировать все хотелки от пользователя и превратить их в набор формочек например

Count: ___
Names: ___

И транслировать их в фиксированные запросы типа
SELECT * FROM database WHERE count > _ AND Name IN (___,___)


И второй вариант - дать пользователю конструктор запросов. Чтоб пользователь как-бы мышкой
накликал набор предикатов-фильтров
. Я не специалист в PHP, но в Java например такие конструкторы
(билдеры) выглядят вот так https://www.jooq.org/ или так querydsl.com

Все остальные варианты ты просто не потянешь в силу наверное слабого опыта. Сделать полноценную
защиту от инжекций - сложно даже профессионалам. Это - вечная борьба в кошки-мышки. И тебе
надо очень хорошо знать и DBMS и синтаксические парсеры чтобы хоть что-то полноценно там создать.
И не просто создать и все время поддерживать. Быть в тренде обновлений DBMS и новых векторов угроз.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
По хорошему лучше так не делать. Разбор синтаксического дерева - это довольно сложная задача и ее стоит решать в крайнему случае.
Я бы рекомендовал ввести по полю на все ваши возможные фильтра и уже их использовать для построения запроса. Например: id (id = ), amountFrom (amount >=), createdAtFrom (createdAt >=),... Каждый фильтр объединяет в себе операцию и поле табицы. Да, прийдется перечислить все ваши поля и операции, но это решение самое простое в поддержке.

Так же вы можете передавать массив фильтров, в стиле: [field, operation, value].
На этапе обработки вы сможете относительно легко проверить и название поля, и операцию (>,<,=,!=,...), и заэкранировать значение. Вложенные условия будут уже сложнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы