Как мне надежно создавать запросы в Ado.net, где таблицы выбираются из изменения?
-
27-09-2019 - |
Вопрос
В Ado.net вы можете добавлять параметры в командный объект, чтобы надежно добавить ввод пользователя в запрос SQL. Что такое эквивалент для других предикатов, общих для запроса SQL?
Я пишу программу, которая по существу является очень ограниченным генератором Mapper и SQL (она в значительной степени сосредоточено вокруг базы данных с мета-информацией и другими базами данных, которые соответствуют этому метаданам). В результате мне нужно иметь возможность назвать такие вещи, как:
string sql = "select " + USER_SELECTED_COLUMNS +
" from " + USER_SELECTED_TABLE +
" where " + USER_CRITERIA;
Некоторые из него (как criteria
) буквально заключен в мою программу доверенными пользователями (другими разработчиками в моей компании), в то время как другие данные вводятся в мою программу ненадежных пользователей (клиентов) через их поиск и т. Д.
Я хотел бы заставить эту программу безопасную, и я знаю, что вышеуказанное нет. В настоящее время у меня есть USER_SELECTED_COLUMNS
заменены на командные параметры, но я не смог найти эквивалент критериев и таблиц. (Или порядка по столбцам). Есть ли какие-либо функции ADO.NET, похожие на SqlParameter
что я могу использовать для невыборных предикатов?
Решение
Я не думаю, что я могу сказать вам, как избежать инъекций SQL в 1 ответ, однако главный указатель, который я могу дать вам:
Используйте Whitelists, а не в черный список.
То есть, когда дезинфицируя ввод пользователей для USER_SELECTED_TABLE
, возможный вход должен быть только возможные таблицы. Вверх, вход для USER_SELECTED_COLUMNS
должны быть ограничены возможными столбцами для USER_SELECTED_TABLE
.
Другие советы
Когда вы создаете экраны, которые позволяют пользователю выбрать таблицу, а столбцы не используйте фактические имена. Вид на то, как у вас будет userId, но показать имя пользователя. Используйте Object_id и column_id (например, form sys.table.object_id и sys.columns.object_id + column_id). PAS в вашей процедуре и создайте свой SQL, используя только числовые идентификаторы, которые присоединяются к просмотрам системы:
sys.tables (Transact-SQL)
Sys.Columns (Transact-SQL)
Вы можете объединить строковую таблицу и имена столбцов, но они будут поступать из видов систем, а не из пользовательского ввода.
Запустите все переменные, которые вы указали выше через Библиотека веб-защиты Microsoft. Отказ Он обеспечит безопасность как от SQL-инъекции, так и XSS. Существуют примеры в загрузке, чтобы показать, как его использовать в Codebehind.