Как безопасно создавать запросы в ADO.NET, где меняются таблицы, выбранные - PullRequest
3 голосов
/ 22 ноября 2010

В ADO.NET вы можете добавить параметры к объекту команды, чтобы безопасно добавить пользовательский ввод в запрос SQL. Что эквивалентно для других предикатов, общих для SQL-запроса?

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

string sql = "select " + USER_SELECTED_COLUMNS + 
            " from " + USER_SELECTED_TABLE + 
            " where " + USER_CRITERIA;

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

Я бы хотел сделать эту программу защищенной, и я знаю, что вышесказанное - нет. В настоящее время у меня USER_SELECTED_COLUMNS заменены на параметры команды, но я не смог найти эквивалент для CRITERIA и TABLE. (Или порядок-по столбцам). Существуют ли какие-либо функции ADO.NET, подобные SqlParameter, которые я могу использовать для предикатов без выбора?

Ответы [ 3 ]

5 голосов
/ 22 ноября 2010

Я не думаю, что смогу рассказать вам, как избежать SQL-инъекций в одном ответе, однако основной указатель, который я могу вам дать, таков:

ИСПОЛЬЗУЙТЕ БЕЛЫЕ СПИСКИ, НЕ ЧЕРНЫЕ СПИСКИ.то есть, при дезинфекции пользовательского ввода для USER_SELECTED_TABLE возможный ввод должен быть только возможными таблицами.Точно так же ввод для USER_SELECTED_COLUMNS должен быть ограничен возможными столбцами для USER_SELECTED_TABLE.

2 голосов
/ 22 ноября 2010

при создании экранов, которые позволяют пользователю выбирать таблицу, а столбцы не используют фактические имена.Вид, как у вас будет UserID, но покажет UserName.Используйте object_id и column_id (например, форму sys.tables.object_id и sys.columns.object_id + column_id).Вставьте их в свою процедуру и создайте свой SQL, используя только числовые идентификаторы, которые присоединяются к системным представлениям:

sys.tables (Transact-SQL)
sys.columns(Transact-SQL)

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

1 голос
/ 22 ноября 2010

Запустите все переменные, которые вы указали выше, через Microsoft Web Protection Library . Это обеспечит безопасность как от SQL-инъекций, так и от XSS-атак. В загрузке есть примеры, чтобы показать вам, как использовать его в codebehind.

...