Как ограничить Sequel ruby, чтобы разрешить оператору SELECT только метод выборки?

Я позволяю своим пользователям выполнять SQL-запросы в приложении, которое я создаю. Они могут вводить строки подключения к базе данных (поддерживаются mysq, pg и другие rdbms). Есть ли способ разрешить операторы SELECT только для методов выборки, подобных этому?

   client = Sequel.connect "mysql2://user:pass@hostname/some_db"
   client.fetch("SELECT * FROM sample_table").all

и запретить следующее

   client.fetch("DROP DATABASE some_db").all
   client.fetch("TRUNCATE some_table").all
   client.fetch("ALTER some_table").all

и могу ли я также получить таблицы и типы данных столбцов каждой таблицы, используя драгоценный камень продолжения?


person Jurot King    schedule 24.01.2018    source источник
comment
Как насчет разбора запроса и определения, является ли он запросом выбора или чем-то еще? И да, это возможно.   -  person Nico Haase    schedule 24.01.2018


Ответы (1)


Это звучит как опасная вещь. Трудно правильно дезинфицировать ввод для всех случаев. Просто подумайте о процедурах, динамически создаваемом SQL, объединенных операторах, PLSQL, верхнем и нижнем регистре, вариантах SQL, ошибках в вашем дезинфицирующем средстве, ...

И вы никогда не должны недооценивать творчество злоумышленников.

Лучше всего было бы справиться с этим на уровне БД и создать пользователя только для чтения с соответствующими правами доступа.

person Pascal    schedule 24.01.2018