Безопасность пользовательских прямых SQL-запросов в EntityFramework 6
Мне нужно (заново) разработать инструмент для пользователей приложения, над которым я работаю, который находится в ASP.NET 4.5.2 / MVC 5.2.3 и использует Entity Framework 6.
Предполагается, что этот инструмент позволяет авторизованным пользователям редактировать запросы SQL, а также пользователям с более низким уровнем привилегий, чтобы выполнять их. Я беспокоюсь о безопасности такого инструмента, даже если веб-приложение должно быть доступно только как интрасеть.
Любой данный запрос может быть только SELECT
и может иметь JOIN
на нескольких столах.
Есть ли какая-либо особая функция EF6, которая позволяет мне проверять или даже ограничивать строку sql только одним SELECT
?
Должен ли я иметь конкретного пользователя внутри базы данных, который может делать только SELECT
s и использовать отдельное соединение для этих запросов как этот пользователь?
Есть ли что-нибудь еще о безопасности такого инструмента, который я мог бы упустить из виду?
Я знаю, что этот инструмент не имеет смысла и даже не должен существовать, но я не отвечаю за решения, и мы планируем удалить этот инструмент, как только сможем.
1 ответ
У меня есть идея. Вы можете определить доступные объекты и свойства для построения такого запроса. Например, для объекта "Клиент" пользователь может выбрать: Имя, Фамилия, Orders.Items.Name, Orders.OrderDate (свойства навигации).
Пользователь отправляет параметры в виде строки на сервер, который преобразует параметры в лямбда-выражение (используя конструкторы времени выполнения лямбда-выражений), а затем присоединяет его в запросе, например Customers.Select(selectExp).ToList()
Это тебе помогает?