3

Я занимаюсь разработкой хранилища данных с использованием Ruby on Rails, и я должен разрешить пользователю выполнять произвольные запросы SELECT в базе данных приложений.Созданный пользователем SQL-запрос

Я знаю, что это обычно НЕ ДОЛЖНО делать, но это интерфейс, который мне нужен на самом деле (я не могу придумать все возможные запросы, которые пользователь может захотеть сделать, и перевести их на запросы ActiveRecord). Могут быть сложные объединения и подзапросы и т. Д. Я бы предпочел сделать это (интегрировать его в свое приложение), чем позволить им получить доступ к БД через pgAdmin (я использую postgresql).

Мой вопрос: какой самый безопасный способ сделать это? Я должен уметь избегать чего-то вроде INSERT, UPDATE, DROP TABLE и т. Д.

Я подумываю получить строку запроса и дезинфицировать эти «опасные» слова, а затем использовать ActiveRecord :: Base.connection.execute (sanitized_sql_string). Это разумный подход?

+1

Вы правы, что опасно позволять пользователям ** вводить ** свой собственный SQL. Вы можете заблокировать права, чтобы они не могли повредить вашу базу данных, но вы не можете помешать им неправильно входить в таблицы, что может создать ** убегающий запрос **. Andyne (sp?) Имел обыкновение иметь продукт под названием GQL (графический язык запросов), который позволяет пользователю щелкнуть объекты и строки, чтобы графически создать запрос. Это сделало работу за кулисами, чтобы создать ** хороший ** SQL. Вы можете использовать аналогичный подход, чтобы пользователи 1) не должны были изучать вашу модель базы данных и 2) не должны были знать SQL для создания специального запроса. –

+0

Возможно, вам будет лучше купить магазин, например, отчеты о кристаллах или бизнес-объекты. На самом деле Microsoft Access со связанными таблицами не так уж плох. –

+0

Я не знаю, я мог бы быть один здесь, но я думаю, что разрешение специальных запросов отлично, если все сделано правильно. Это, очевидно, инструмент питания, предназначенный только для определенных пользователей, которые знают SQL. У некоторого хромого редактора всегда будут ограничения; Я все еще не вижу того, что считаю полезным.Безопасность в Postgres великолепна при правильном использовании, и вы можете избежать * безудержных запросов *, установив тайм-аут запроса как 5 секунд или что-то в этом роде. Имейте в виду, что [StackOverflow] (http://data.stackexchange.com/) фактически разрешает специальные запросы. –

ответ

3

Самый безопасный способ - позволить Postgres справиться с этой безопасностью для вас. Создание нового пользователя:

CREATE USER Reader; -- Your Rails app should logon with this user 

Затем явно грант SELECT разрешений на объекты, которые вы хотите, чтобы они были в состоянии запросить:

GRANT INSERT ON TableFoo TO Reader; 
GRANT INSERT ON TableBar TO Reader; 

Тогда, они будут иметь возможность запускать произвольный SELECT запросы из этих двух таблиц, но если они попробуют INSERT, они получат Разрешение отклонено. Затем вы можете отловить эти исключения безопасности и соответствующим образом обрабатывать их в своем интерфейсе.

+0

Вам понадобятся права «GRANT» на схемах, содержащих также интересующие таблицы. Это, без сомнения, правильный подход. Можете ли вы убедить Rails войти в систему с разными пользователями для разных целей, это совсем другое дело ... –

+0

Мне нравится этот подход. Дело в том, что мне нужно получить доступ к тем же моделям с разными подключениями, поэтому мне в конечном итоге нужно будет выполнить запрос в среде без чтения (я использую результат запроса для обновления других моделей). То, что я собираюсь сделать, - это проверка запроса с использованием пользователя, использующего только для чтения, прежде чем сохранить его для будущего, использования в реальной жизни. Это звучит разумно? – pcarranzav

1

Создайте приложение, затем создайте базу данных.

После этого в вашей конфигурации базы данных (database.yml) подключитесь к базе данных с некоторыми пользователями, не являющимися пользователями по умолчанию, скажем lame_user. Создайте этот lame_user на вашей РСУБД, в вашем случае PostgreSQL и предоставите ему только разрешения SELECT для всех ваших таблиц.
Теперь у вас будет postgres и lame_user, которые могут получить доступ к вашей базе данных, но только postgres может делать все возможное.

Если пользователь пытается сделать что-либо помимо SELECT, произойдет ошибка.

Возобновление: Сделать это приложение ограничено базой данных. Будет легче.

Смежные вопросы