Очистить динамический запрос SQL, созданный пользователем.разрешен только SELECT (нет INSERT, UPDATE, DELETE, DROP, EXEC и т.д ...) - PullRequest
0 голосов
/ 22 февраля 2011

Я разрабатываю веб-сайт ASP2.0 с базой данных Microsoft SQL Server 2005.Мне нужно реализовать функциональность, которая позволяет пользователям создавать запрос на выборку (ничего сложного), чтобы на веб-сайте отображалась страница с набором результатов запроса.Мой вопрос заключается в том, как я могу санировать запрос, чтобы убедиться, что нет вставки / обновления / удаления / удаления или других вредоносных инъекций.

также мне нужно заключить запрос в предложение «with», чтобы я могМожно добавить столбец идентичности в набор результатов.(Мне нужно, чтобы результаты правильно отображались на странице)

мой код CSharp для форматирования запроса выглядит следующим образом (немного упрощено):

string query = txtQuery.Text;
query = query.ToLower();
query = query.Trim();
int orderByIndex = query.LastIndexOf("order by");
string orderBy = "";
if (orderByIndex != -1)
{
    orderBy = query.Substring(orderByIndex);
    query = query.Replace(orderBy, "");
}
query = "with query as (" + query + ") select row_number() over(order by (select 0)) as rowID, * from query " + orderBy;

Я хочу создать сохраненныйпроцедура для выполнения запроса.Я думал о чем-то вроде этого:

CREATE PROCEDURE usp_execute_query
@sql nvarchar(max)
with execute as 'RestrictedUser'
as
begin
    exec sp_executesql @sql
end

с RestrictedUser, похожим на это:

CREATE USER RestrictedUser WITHOUT LOGIN
EXEC sp_addrolemember db_datareader, RestrictedUser

Мои вопросы: есть ли способ проверить роли RestrictedUser в хранимой процедуречтобы убедиться, что они не были подделаны?И raiserror, если они есть.Как вы думаете, все это правильный путь?Любое предложение?

1 Ответ

1 голос
/ 22 февраля 2011

Опасность Уилл Робинсон!Каждый раз, когда вы разрешаете пользователю передавать произвольный SQL, вы сталкиваетесь со всевозможными проблемами безопасности.Вероятность того, что вы закроете каждое отверстие, невелика.Кроме того, возможность «дезинфицировать» запрос зависит от вашей способности анализировать запрос.Можно разобрать SQL самостоятельно, но это не тривиально при любом воображении.Кроме того, поскольку это веб-приложение, вы сравниваете свои навыки со многими людьми, у которых, вероятно, больше опыта в проведении SQL-инъекций.

Создание пользователя с очень ограниченными разрешениями - это хорошо (и, вероятно, ваш лучший шанс).Тем не менее, вам нужно быть внимательным к тому, к чему у них есть доступ (системные хранимые процедуры, системные представления и т. Д.).Другими словами, db_datareader недостаточно ограничен .Вы захотите создать совершенно новое правило и только дадите им разрешение на очень конкретные предметы.

Имейте в виду, что даже если вам удастся ограничить объемы данных, которые может видеть пользователь (в данном случае хакер), вы все равно уязвимы для атак DOS (отказ в обслуживании).

...