SQL-инъекция: недостаточно ли заменить ("'", "' '")? - PullRequest
11 голосов
/ 14 декабря 2011

Хотя я определенно вижу преимущества использования параметров для запросов SQL, особенно когда имеешь дело с датами и тому подобным, я все еще не уверен насчет параметров как способа only для предотвращения внедрения SQL.
Дело в том, что я унаследовал приложение, и у него есть такие вещи, как

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

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

Ответы [ 5 ]

16 голосов
/ 14 декабря 2011

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

С

Шпаргалка по предотвращению инъекций SQL OWASP

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

Есть еще ниже

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

Мифы и заблуждения об инъекции Sql

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

3 голосов
/ 14 декабря 2011

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

Все еще существует двойное или отражающее внедрение.Например, вы можете сохранить

'; delete from orders'

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

2 голосов
/ 14 декабря 2011

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

1 голос
/ 14 декабря 2011

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

0 голосов
/ 14 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...