У меня есть проект (частный, веб-сайт ASP.net, защищенный паролем с помощью https), в котором одно из требований заключается в том, чтобы пользователь мог вводить запросы Sql, которые будут напрямую запрашивать базу данных. Мне нужно иметь возможность разрешать эти запросы, не допуская, чтобы они наносили ущерб самой базе данных, а также не могли получить доступ или обновить данные, к которым они не смогут получить доступ / обновить.
Я разработал следующие правила для реализации:
- Используйте пользователя базы данных, который только имеет разрешение на выбор таблицы / просмотр и обновление таблицы (таким образом, любые другие команды, такие как drop / alter / truncate / insert / delete, просто не будут выполняться).
- Убедитесь, что выписка начинается со слов «Выбрать» или «Обновить»
- Убедитесь (используя Regex), что в выражении нет точек с запятой, которые не заключены в одинарные кавычки, пробелы и буквы. (Здесь мысль состоит в том, что единственный способ, которым они могут включить второй запрос, состоит в том, чтобы завершить первый точкой с запятой, которая не является частью входной строки).
- Убедитесь (используя Regex), что у пользователя есть разрешение на доступ к запрашиваемым / обновляемым таблицам, включенным в объединения и т. Д. Это включает любые подзапросы. (Частично способ, которым это будет достигнуто, состоит в том, что пользователь будет использовать набор имен таблиц, которые на самом деле не существуют в базе данных, часть синтаксического анализа запроса будет заключаться в замене в запросе правильных соответствующих имен таблиц) .
Я что-то упустил?
Цель состоит в том, чтобы пользователи могли запрашивать / обновлять таблицы, к которым у них есть доступ, любым способом, который они считают нужным, и предотвращать любые случайные или злонамеренные попытки повредить базу данных. (А поскольку требуется, чтобы пользователь генерировал sql, у меня нет возможности параметризовать запрос или санировать его с помощью любых известных мне встроенных инструментов).