Я могу найти так много информации в Интернете о правильном и безопасном способе динамического создания параметризованных запросов. Однако на таких сайтах говорят только о параметризации предложения where.Насколько уязвим этот динамически созданный sql?
Ну, а как насчет других предложений инструкции sql? Смотрите следующее:
string sql = string.Format(@"
SELECT MIN(TableName) as TableName, {0}
FROM
(
SELECT 'Table A' as TableName, {0}
FROM {1}
UNION ALL
SELECT 'Table B' as TableName, {0}
FROM {2}
) tmp
GROUP BY {0}
HAVING COUNT(*) = 1", columnList, tableA, tableB);
Я построение заявления, в котором следующий был параметрироваться:
- Элементов в выбранном пункте
- имени таблицы в предложении из
Вопрос: Насколько уязвим это для SQL-инъекции, которая может нанести некоторый урон?
Я не могу думать, что вредоносный хакер может ввести sql, что приведет к правильно сформированному исполняемому sql. Но опять же, я не специалист по sql.
Каждый раз, когда любая часть запроса поступает из ненадежного источника, он уязвим для атаки SQL-инъекции. Например, если у вас есть строка кода выше 'tableA = someBool? «foo»: «bar»; «тогда нет никакого риска, потому что это будет либо foo, либо bar. Но если вы получаете значение 'tableA' из какой-либо формы представления или какого-либо другого внешнего источника, с которым вы не контролируете, тогда вы рискуете. То же самое касается других переменных, используемых в запросе. – itsme86
использовать параметризованный запрос, то есть рекомендуемый подход –
Параметры @EhsanSajjad sql не могут использоваться для имен таблиц и столбцов. – Amy