Чтобы начать это, мне хорошо известно, что параметризованные запросы - лучший вариант, но я спрашиваю, что делает стратегию, представленную ниже уязвимой. Люди настаивают на том, что нижеследующее решение не работает, поэтому я ищу пример того, почему это не так.
Если динамический SQL построен в коде с использованием следующего экранирования перед отправкой на SQL Server, какая инъекция может победить это?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Аналогичный вопрос был дан ответ здесь, но я не верю, что какой - либо из ответов применимы здесь.
В SQL Server невозможно выполнить одиночную цитату с помощью "\".
Я считаю, что SQL-контрабанда с Unicode (описанная здесь) была бы сорвана тем фактом, что создаваемая строка помечена как Unicode N, предшествующей одиночной кавычки. Насколько я знаю, нет других наборов символов, которые SQL Server автоматически переводил бы в одну цитату. Без неизолированной одинарной цитаты я не считаю, что инъекция возможна.
Я не считаю, что String Truncation также является жизнеспособным вектором. SQL Server, конечно же, не будет делать усечение, так как максимальный размер для nvarchar
составляет 2 ГБ в соответствии с Microsoft. Строка 2 ГБ небезопасна в большинстве ситуаций и невозможна в моей.
Вторжение второго заказа может быть возможным, но возможно ли, если:
- Все данные, поступающие в базу данных, дезинфицируются с использованием вышеуказанного метода
- Значения из базы данных никогда не добавляются в динамический SQL (почему бы вам вообще это сделать, если вы можете просто ссылаться на значение таблицы в статической части любой динамической строки SQL?).
Я не предлагаю, чтобы это было лучше или альтернативой использованию параметризованных запросов, но я хочу знать, как то, что я изложил, уязвимо. Есть идеи?