Действительно ли инъекция SQL возможна путем добавления второго запроса?

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

Базовый mysql_ не принимает второй запрос внутри запроса, не так ли?

Итак, в основном, это

$unsafe = "');DROP TABLE table;--"; mysqli_query($con,"INSERT INTO table (Column) VALUES ('$unsafe'"); 

на самом деле не делает ничего вредного? Поправьте меня на это.

У меня нет опыта работы с mysqli_ , поэтому я перейду к PDO и «Подготовленные утверждения».

Когда я начал работать с PDO, у меня не было информации об этом, и в основном использовал его так, считая, что это безопасно.

 $stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe'); $stm->execute(); 

Однако то же самое с PDO, как с mysql_ . Он не поддерживает несколько запросов из коробки, не так ли? Опять же, поправьте меня на это.

Тогда это безопасно, если я не ошибаюсь?

 $stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?); $stm->execute(array($unsafe); 

Как вредоносный пользователь, не имеющий доступа к базе данных, внедряет вредоносные данные, если несколько запросов даже не поддерживаются?

Или они?

Два запроса с mysql + php – ошибка

Вы действительно назвали своего сына «Робертом»), Drop TABLE Students -

Источник: http://xkcd.com/327/

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

Это не значит, что это невозможно – только это должно быть очень очевидно, когда оно есть.

SQL-инъекция очень реальна

Но вышеупомянутое означает почти ничего с точки зрения внедрения sql. Существует огромное количество информации о SQL-инъекции, в том числе большое количество вопросов здесь о переполнении стека . Взяв пример в вопросе, это эквивалентная атака, которая будет работать:

 $id = "123 OR 1 = 1 --"; mysqli_query($con,"DELETE FROM table WHERE id = $id LIMIT 1"); 

т.е. найти интерфейс для удаления моего собственного, например, комментария, если идентификатор не экранирован, было бы тривиально удалить все комментарии. Но этот пример – только самый верхушка айсберга.

Выполнение произвольных операторов sql можно использовать

Этот код в вопросе:

 $stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')"); $stm->execute(); 

Ни одно из преимуществ использования PDO – то есть любой эксплойт (из действительно массивного числа), который будет работать с драйвером mysql / mysqli (используется наивно), будет работать с pdo, используемым таким образом.

Параметризированные запросы защищают от SQL-инъекций

Использование PDO с подготовленными операторами с параметрами ускоряет значения, которые должным образом предотвращают атаки sql-инъекций, поэтому да, это безопасно от инъекции:

 $stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?)"); $stm->execute(array($unsafe)); 

Как вредоносный пользователь, не имеющий доступа к базе данных, вводит вредоносные данные

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

Например:

 function login() { $username = "irrelevant' OR is_admin = 1 --"; $password = hash('irrelevant'); $query = "SELECT id from users where username = '$username' AND password = '$password'"; ... } 

Как злоумышленник получил доступ к функциям администратора в системе, не заботясь об инъекции? Очень легко.

Общие сведения об инъекции см. В предыдущих ссылках.

Как вредоносный пользователь, не имеющий доступа к базе данных, внедряет вредоносные данные, если несколько запросов даже не поддерживаются?

«SQL-инъекция» не равна «второму запросу».

Или они?

Конечно.

Второй запрос – всего лишь пример . Хотя это может быть любой допустимый оператор SQL. SQl-инъекция – это эксплойт неправильно отформатированного запроса. Если разработчик не правильно форматирует SQL, есть возможность выйти из пределов литерала и добавить код в тело SQL.

Действительно ли инъекция SQL возможна путем добавления второго запроса?

Да, зависит от API, который вы используете.