От чего вас защищают параметры sql?

Параметры используются для защиты от злонамеренного ввода данных пользователем.

Но если параметр ожидает строку, можно ли записать ввод, который будет интерпретироваться как sql, чтобы злоумышленники могли использовать такие вещи, как 'DROP', 'TRUNCATE' и т. д.?

Есть ли различия в защите между параметрами в asp, asp.net, java и других?


См. Также: Достаточно ли параметров для предотвращения SQL-инъекций?

См. Мой вопрос здесь: http://stackoverflow.com/questions/306668/are-parameters-rea‌lly-достаточно-для-предотвращения‌ t-sql-инъекций для интересного обсуждения параметров sql.

Rune Grimstad 15.01.2009 15:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
1
2 377
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Не как параметр. SQL-инъекция основывается на объединении вредоносного кода в строку SQL и последующем выполнении инструкции SQL из этой строки. Подготовленный оператор принимает параметры независимо от содержимого. С подготовленным оператором фактический текст самого оператора SQL никогда не изменяется.

Единственный риск будет заключаться в выполнении exec на параметризованной строке.

Во всех остальных случаях параметризованные запросы безопасны.

Так, например, в asp операторы 'DROP' и т.п. будут отфильтрованы?

Sander Versluys 15.01.2009 15:36

Не фильтруется, никогда не выполняется. Они не могут изменить текст SQL-запроса. Если у вас есть хранимая процедура, которая фактически создает и выполняет строку SQL (как указано на плакате), проблема все равно может возникнуть.

ConcernedOfTunbridgeWells 15.01.2009 15:38

Если это параметризованный запрос, sql не создается путем конкатенации строк, как указывали другие, поэтому нет шансов на выполнение неприятного содержимого в параметрах (если вы не используете exec)

Andrew Rollings 15.01.2009 15:38
Ответ принят как подходящий

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

Могут быть технические различия в том, как это реализовано в разных фреймворках, но основная идея (и результат) одинаковы.

Кроме того, параметры выполняют преобразование данных за вас. Это особенно полезно при хранении значений даты или даты и времени.

Rune Grimstad 15.01.2009 15:44

Нет. Атаки с использованием SQL-инъекций могут происходить с любого языка в любой базе данных SQL. Тип атаки, о которой вы говорите, - это когда программист использует динамический SQL в своем источнике, например 'USER_NAME = sName', и пользователь может вводить неограниченный текст для имени пользователя, чтобы он мог добавлять комментарий, а затем вводить любые новые операторы SQL, такие как ' DROP ',' TRUNCATE 'и т. д.

Ничто, что вы вводите в качестве параметра через вызов BindWhatever (), никогда не может быть выполнено как SQL.

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

Конечно, кто-то все еще может передать вам некоторый JavaScript, когда база данных будет точно хранить и, возможно, служить для выполнения в другом браузере!

Так что вам все равно нужно избавиться от ввода (или, по крайней мере, экранировать) любых символов ({[]}) \ type;

Вы должны быть осторожны со своими определениями. «Параметры» могут означать несколько вещей; например, параметры хранимой процедуры не защищают вас сами по себе. Чтобы использовать Java в качестве примера:

sql = "exec proc_SearchForUser '" + userNameToSearch + "'";

не лучше и не хуже сырого

sql = "SELECT * FROM Users WHERE userName = '" + userNameToSearch + "'";

и так же восприимчив к имени пользователя

';DROP TABLE users;--

С другой стороны, параметризованные запросы БЕЗОПАСНЫ. Они могут выглядеть как

PreparedStatement statement = con.prepareStatement("SELECT * FROM Users WHERE userName = ?");

или действительно

PreparedStatement statement = con.prepareStatement("exec proc_SearchForUser ?");

Причина, по которой это безопасно, заключается в том, что когда вы вводите значение ..., например,

statement.setString(1, userName);

тогда строка - даже такая, как "'; DROP TABLE users; -" - будет правильно экранирована механизмом БД и визуализирована безобидно.

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

Другие вопросы по теме