Есть ли способ программно вызывать из C # операторов, таких как CREATE / ALTER DATABASE на SQL Server, без создания проблем безопасности? - PullRequest
0 голосов
/ 29 июня 2011

У меня есть приложение .NET, которое выполняет следующую инструкцию, используя SqlCommand:

DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)

Параметр @DB поступает из пользовательского ввода, поэтому очевидно, что приложение уязвимо для чего-то вроде 'X DROP DATABASE Y».Я уверен, что должен быть очевидный способ пропустить ...

Редактировать: использование параметризованного оператора не может работать, потому что вы не можете использовать параметр в CREATE DATABASE (CREATE DATABASE @DB возвращает синтаксическую ошибку).

Ответы [ 3 ]

5 голосов
/ 29 июня 2011

Во-первых, вы не должны никогда, никогда делать это из веб-приложения. Когда-либо. В самом деле. Я серьезно. За исключением пакетов развертывания, единственное время, которое мне нужно для выполнения CREATE DATABASE, - это анализатор запросов в SSMS. Кроме того, я с подозрением отношусь к любому коду, который позволил бы пользователю ввести имя базы данных, а затем пойти и создать его.

Самое главное, то, что вы опубликовали, не является "параметризованным запросом". Это сцепленный SQL, который является источником уязвимостей внедрения SQL. . Если бы это был параметризованный запрос (или хранимый процесс, но я не думаю, что вы можете сделать CREATE DATABASE из sproc), SQL-инъекция не будет проблемой.

Вы можете либо использовать реальный параметризованный запрос ( здесь хороший учебник по параметризованным запросам. ), либо дезинфицировать ваши входные данные, но ADO.NET или любая другая библиотека БД будет надежно обрабатывать это для вас, ЕСЛИ вы правильно строите объекты команд и параметров.

0 голосов
/ 29 июня 2011

Используйте подход белого списка: разрешите только буквы.

0 голосов
/ 29 июня 2011

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

Как я уже сказал в своем комментарии, я надеюсь, что есть исключительно веская причина для создания баз данных / таблиц на лету, где создание строк, похоже, работает для большинства остальных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...