Как мне надежно создавать запросы в Ado.net, где таблицы выбираются из изменения?

StackOverflow https://stackoverflow.com/questions/4246076

Вопрос

В 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top