Как ограничить произвольный mysql запрос только SELECT командой?

Задача — дать пользователям возможность писать полноценный mysql запрос на выборку, но при это ограничить какие-либо команды модификации.
Как лучше это сделать? Может кто-то встречал php библиотеки, которые бы парсили запрос и ограничивали только SELECT?

Спасибо!

update: разграничение путем доступов, к сожалению, в данном случае не возможен.
  • Вопрос задан
  • 3912 просмотров
Пригласить эксперта
Ответы на вопрос 8
@Vampiro
ИМХО grant
Ответ написан
Комментировать
jonie
@jonie
сделать парсер грамматики и прогонять запросы через него вариант?
Готовые грамматики (даже для mysql) благо имеются, например тут www.antlr.org/grammar/list. Да и самому можно написать исходя из требований… Регэкспы тут имхо дело неблагодарное…
Ответ написан
Комментировать
script88
@script88
А чем не устраивает создание пользователя в mysql и выставить ему привилегии только на SELECT ?!
Ответ написан
@TimID
Это не поможет.
Есть же, к примеру, "SELECT source INTO destination" запрос, который создает новую таблицу или вносит данные в существующую.
Ответ написан
vsespb
@vsespb
Ещё бывает что несколько запросов разделены запятыми — «select…; delete»

Но впринципе имхо вполне реально написать код, который будет проводить валидацию запроса.
Ответ написан
Комментировать
vsespb
@vsespb
Хм. вообще
dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html

SELECT source INTO destination не поддерживается.

имхо проверять регэкспом что запрос начинается как "\A*select", настроить API чтобы не допускало несколько statements через ';'

хотя тут нужно поресерчить ещё и убедиться что это безопасно.
Ответ написан
Комментировать
Skull
@Skull
А почему не написать регулярку, которая при виде INSERT, UPDATE, DELETE, TRUNCATE, ALTER, INTO, SET, VALUES, будет материться?
Ответ написан
FloppyFormator
@FloppyFormator
Грант на селект, конечно, самое адекватное решение.
Как вынужденная мера, можно попробовать анализировать введённый запрос и на основании результата передавать либо не передавать его СУБД.
Но я бы предложил обратную процедуру: конструировать запрос из имеющихся данных, введённых любым удобным способом, в том числе и парсингом исходного запроса. Главное, передавать СУБД не введённые извне данные, а специально сформированный запрос, в котором гарантированно не будет «неправильных» конструкций. А если таковые есть в исходном запросе, выдавать ошибку.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы