Назад | Перейти на главную страницу

Можете ли вы заставить MS Sql Server отклонять все запросы, соответствующие определенному шаблону?

Я хотел бы знать, можете ли вы заставить Sql Server смотреть на входящие строки запроса и отклонять те, которые соответствуют определенному шаблону. Другими словами, для определенного класса запросов (возможно, определяемых регулярным выражением) я хочу знать, можно ли заставить Sql Server возвращать сообщение об ошибке, а не обрабатывать их, как обычно.

Чтобы быть более конкретным и дать потенциальный вариант использования, рассмотрим это описание атаки Sql Injection. Если бы мой веб-сайт подвергался постоянной атаке со стороны техник, подобных этим, и если бы исправление веб-сайта выглядело как длительный процесс, было бы заманчиво (если бы Sql позволял это) попытаться получить некоторое временное облегчение, поместив что-то в Sql, в котором в основном говорилось

Если запрос соответствует регулярному выражению CAST (0x [0-9A-Za-z] {20,} тогда не выполняйте это!

Я предполагаю, что, если такая фильтрация возможна, тогда для ее выполнения потребуется написать какую-то настраиваемую DLL-надстройку Sql Server. Но, может быть, вы сможете сделать что-то подобное с помощью встроенных функций аудита Sql Server 2008? Я действительно понятия не имею, и я не уверен, где в документации было бы лучше всего начать поиск.

Если вы хотите указать, почему база данных - глупое место для попытки блокировать атаки с использованием sql-инъекций, это нормально. Но мой главный вопрос заключается не в том, является ли это хорошей идеей в данном конкретном случае использования, а в том, возможна ли вообще такая фильтрация / отклонение запросов.

Нет, у вас не может быть операторов отклонения SQL-сервера на основе совпадения с шаблоном. Как насчет того, чтобы запретить всем пользователям привилегии SELECT и заставить их использовать созданные вами хранимые процедуры для доступа к данным в ваших базовых таблицах? Пока вы хорошо проверяете входные данные для sprocs, вы должны быть в достаточной безопасности.

Ваша догадка оказалась верной: база данных - неподходящее место для решения этой проблемы. Вся причина, по которой SQL-инъекции работают, заключается в том, что команды являются действительными SQL. Обычно к тому времени, когда ваше приложение передает запрос на сервер базы данных, специальные символы снова превращаются в обычный текст.

Если вы не хотите смягчать это на уровне приложений, вам следует изучить программные брандмауэры, такие как dotDefender. На мой взгляд, это тоже решает проблему не в том месте, и что-то в конечном итоге преодолеет логику брандмауэра.

Нет никакого способа заставить SQL Server отклонять команды на основе соответствия шаблону. Чтобы сделать что-то подобное, вам нужно будет написать слушателя, который будет принимать команды SQL, проверять их, а затем передавать их механизму базы данных для выполнения.

Было бы намного лучше справиться с этим на уровне приложения.