Здесь, в компании, в которой я работаю, у нас есть инструмент поддержки, который, помимо прочего, предоставляет страницу, позволяющую пользователю выполнять запросы SELECT.Это должно препятствовать выполнению пользователем UPDATE, INSERT, DELETE, DROP и т. Д. Кроме того, каждый оператор выбора принимается.
Способ, которым он работает, заключается в выполнении
SELECT * FROM (<query>)
, так что любойОператор кроме SELECT должен завершиться ошибкой из-за синтаксической ошибки.
На мой взгляд, такого подхода недостаточно для предотвращения атаки, поскольку все может изменить исходящий запрос и нарушить безопасность.Я подтвердил, что наряду с этим решением он должен также проверять синтаксис запроса внутри .Мои коллеги попросили меня доказать, что текущее решение небезопасно.
Чтобы проверить его, я попытался написать что-то вроде
SELECT * from dual); DROP table users --
Но это не удалось из-за ; символ, который не принимается соединителем SQL.
Итак, есть ли способ добавить оператор модификации в запрос, подобный этому?
Кстати,это Oracle SQL.
РЕДАКТИРОВАТЬ:
Просто чтобы прояснить это: я знаю, что это не очень хороший подход.Но я должен доказать это своим коллегам, чтобы оправдать изменение кода.Теоретические ответы хороши, но я думаю, что реальная инъекция была бы более эффективной.