Я занимаюсь разработкой хранилища данных с использованием Ruby on Rails, и я должен разрешить пользователю выполнять произвольные запросы SELECT в базе данных приложений.Созданный пользователем SQL-запрос
Я знаю, что это обычно НЕ ДОЛЖНО делать, но это интерфейс, который мне нужен на самом деле (я не могу придумать все возможные запросы, которые пользователь может захотеть сделать, и перевести их на запросы ActiveRecord). Могут быть сложные объединения и подзапросы и т. Д. Я бы предпочел сделать это (интегрировать его в свое приложение), чем позволить им получить доступ к БД через pgAdmin (я использую postgresql).
Мой вопрос: какой самый безопасный способ сделать это? Я должен уметь избегать чего-то вроде INSERT, UPDATE, DROP TABLE и т. Д.
Я подумываю получить строку запроса и дезинфицировать эти «опасные» слова, а затем использовать ActiveRecord :: Base.connection.execute (sanitized_sql_string). Это разумный подход?
Вы правы, что опасно позволять пользователям ** вводить ** свой собственный SQL. Вы можете заблокировать права, чтобы они не могли повредить вашу базу данных, но вы не можете помешать им неправильно входить в таблицы, что может создать ** убегающий запрос **. Andyne (sp?) Имел обыкновение иметь продукт под названием GQL (графический язык запросов), который позволяет пользователю щелкнуть объекты и строки, чтобы графически создать запрос. Это сделало работу за кулисами, чтобы создать ** хороший ** SQL. Вы можете использовать аналогичный подход, чтобы пользователи 1) не должны были изучать вашу модель базы данных и 2) не должны были знать SQL для создания специального запроса. –
Возможно, вам будет лучше купить магазин, например, отчеты о кристаллах или бизнес-объекты. На самом деле Microsoft Access со связанными таблицами не так уж плох. –
Я не знаю, я мог бы быть один здесь, но я думаю, что разрешение специальных запросов отлично, если все сделано правильно. Это, очевидно, инструмент питания, предназначенный только для определенных пользователей, которые знают SQL. У некоторого хромого редактора всегда будут ограничения; Я все еще не вижу того, что считаю полезным.Безопасность в Postgres великолепна при правильном использовании, и вы можете избежать * безудержных запросов *, установив тайм-аут запроса как 5 секунд или что-то в этом роде. Имейте в виду, что [StackOverflow] (http://data.stackexchange.com/) фактически разрешает специальные запросы. –