SQL-инъекция: не заменяет ( "'", "' '" ) достаточно хорошо?

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

"SELECT Field FROM Table WHERE Filter='"+userinput.Replace("'", "''")+"'"

повсюду. Теперь, когда это не выглядит очень приятным для моих глаз, и я не против переписывать их, мой вопрос, мне нужно? Попытайтесь, как я мог, я не вижу способа выполнить SQL-инъекцию с этим.

Ответ 1

Нет, этого недостаточно. Это будет очень удобно, но это очень слабая альтернатива, и использование параметризованных запросов или параметризованных хранимых процедур лучше, если ваша платформа и/или РСУБД поддерживают любую функцию.

Из

OWASP SQL Injection Prevention Cheat Sheet

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

Ниже ниже

SQL-инъекция - но почему кавычки не являются безопасными больше?

Sql Injection Myths and Fallacies

SQL Injection после удаления всех одиночных кавычек и тире символов

Ответ 2

Да, .Replace("'", "''") останавливает SQL-инъекцию в той же степени, что и параметризация.

Есть еще двойная или рефлексивная инъекция. Например, вы можете сохранить

'; delete from orders'

в поле комментария. Если часть базы данных использует поле комментария в динамическом SQL, она может вместо этого выполнить удаление.

Ответ 3

Если пользователю нужен только доступ к данным только для чтения, тогда пользовательский интерфейс выполняется через пользователя SQL, который имеет доступ только для чтения. Только для чтения не защищает вас от инъекционных атак - они могут использовать его для просмотра данных, которые вы не планировали просматривать, но они не могут использовать инъекцию для удаления данных.

Ответ 4

Я думаю, вы получаете ответ на вопрос, почему этого недостаточно, но вы также сталкиваетесь с проблемой того, что кто-то забывает сделать замену на строке. Если вы всегда используете параметры, это не проблема.

Ответ 5

Используйте процедуру.

Преобразует инструкцию в статический SQL, помещая значение параметра в локальную переменную.

Это помогает!