Отключить все запросы в SQL Server, которые не используют именованные параметры? - PullRequest
0 голосов
/ 06 февраля 2011

Кажется, что можно остановить раз и навсегда угрозу внедрения Sql, просто отклонив все запросы, которые не используют именованные параметры. Любой способ настроить сервер Sql для этого? Или еще какой-нибудь способ обеспечить это на уровне приложения путем проверки каждого запроса без написания всего синтаксического анализатора SQL? Спасибо.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2011
  1. Удалите гранты для роли, чтобы иметь возможность ВЫБРАТЬ / ОБНОВИТЬ / ВСТАВИТЬ / УДАЛИТЬ для соответствующих таблиц
  2. Предоставить EXECUTE на роль хранимых процедур / функций / и т. Д.
  3. Свяжите роль с пользователями базы данных, которых вы хотите защитить

Это не остановит учетную запись, которая также имеет возможность предоставления GRANT-доступа, но остановит пользователей, связанных с ролью (при условии отсутствия других грантов для каждого пользователя), от возможности выполнять запросы вне хранимой существующая процедура / функции / и т. д.

2 голосов
/ 06 февраля 2011

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

Альтернативный способ - добавить дополнительный уровень, который будут иметь все запросыпройти.Короче говоря, вы бы передали все запросы (архитектура SOA) новому приложению, которое оценило бы запрос на передачу на сервер sql.Я видел, как одна компания сделала это в ответ на проблемы с инъекциями SQL, которые были у их сайта.

Конечно, это ужасный способ, потому что SQL-инъекция - это только одна потенциальная проблема.

Помимо SQL-инъекций, у вас также есть проблемы с тем, что происходит, когда сам сайт взломан.После того, как вы можете написать новую страницу на веб-сервере, становится довольно просто передать любой запрос на соответствующий сервер базы данных.Это легко обойдет любую вещь на уровне кода, которую вы можете поставить на место.И это позволит злоумышленнику просто написать select * from ... или truncate table ... Heck, внутренний человек потенциально может просто напрямую подключиться к серверу sql, используя учетные данные сайтов, и выполнить любой запрос, который ему нужен.

Дело в том,Если вы используете безопасность, встроенную в сервер SQL, для предотвращения прямого доступа к таблице, то вы можете контролировать с помощью хранимых процедур весь спектр действий, доступных любому, кто пытается подключиться к серверу.

0 голосов
/ 06 февраля 2011

А как вы хотите проверить это? Запросы иногда имеют постоянные значения, которые так же легко добавляются в запрос. Например, у меня есть база данных, которая готова быть многоязычной, но не весь код таков, поэтому мой запрос выглядит так:

SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1

Идентификатор - это параметр, а идентификатор языка - нет. Этот запрос должен быть заблокирован?

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

Я не думаю, что у сервера sql есть какие-либо встроенные функции для этого.

...