Самый простой способ сделать это - выгрузить это задание в базу данных.Просто убедитесь, что пользователь базы данных, который будет выполнять запросы, имеет доступ на чтение только .Тогда любые запросы, которые делают что-либо кроме SELECT
, будут терпеть неудачу, и вы можете сообщить об этой ошибке пользователям.
Если вы не пойдете по этому пути, сложность становится довольно огромной, так как вы в основномдолжны быть готовы проанализировать произвольный оператор SQL, не говоря уже о произвольных последовательностях операторов SQL, если вы разрешите запуск хранимых процедур.
Даже в этом случае убедитесь, что вы нене пропускайте конфиденциальные данные через ваши запросы.Непосредственный ввод запросов от пользователей сайта может быть опасным, если вы не будете осторожны.Даже если вы разрешаете эти запросы для чего угодно, кроме специально созданной базы данных песочницы, это «упс, я случайно изменил разрешения пользователя», чтобы не превращаться в кошмар безопасности.
Другой вариант - написать «создатель запроса»."страница, где пользователи могут выбрать таблицу и столбцы, которые они хотели бы видеть.Затем вы можете а) отображать только те таблицы и столбцы, которые подходят для данного пользователя (возможно, на основе пользовательских ролей и т. Д.) И б) самостоятельно генерировать SQL, предпочтительно с помощью параметризованного запроса.
Обновить: Как указывает Yahia, если у пользователя есть привилегия на выполнение (чтобы он мог выполнять хранимые процессы), то права самой процедуры соблюдаются.Учитывая это, может быть лучше не разрешать произвольное выполнение хранимых процедур, а предлагать пользователям список процедур, которые, как известно, безопасны.Это, вероятно, будет трудно поддерживать и подвержено ошибкам, поэтому лучше вообще запретить хранимые процедуры.