В 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);
Как вредоносный пользователь, не имеющий доступа к базе данных, внедряет вредоносные данные, если несколько запросов даже не поддерживаются?
Или они?
Источник: http://xkcd.com/327/
Это не будет работать с mysql и php без преднамеренных шагов, чтобы это стало возможным, поскольку обычная функция запроса выполнит только первый запрос.
Это не значит, что это невозможно – только это должно быть очень очевидно, когда оно есть.
Но вышеупомянутое означает почти ничего с точки зрения внедрения sql. Существует огромное количество информации о SQL-инъекции, в том числе большое количество вопросов здесь о переполнении стека . Взяв пример в вопросе, это эквивалентная атака, которая будет работать:
$id = "123 OR 1 = 1 --"; mysqli_query($con,"DELETE FROM table WHERE id = $id LIMIT 1");
т.е. найти интерфейс для удаления моего собственного, например, комментария, если идентификатор не экранирован, было бы тривиально удалить все комментарии. Но этот пример – только самый верхушка айсберга.
Этот код в вопросе:
$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')"); $stm->execute();
Ни одно из преимуществ использования PDO – то есть любой эксплойт (из действительно массивного числа), который будет работать с драйвером mysql / mysqli (используется наивно), будет работать с pdo, используемым таким образом.
Использование 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, который вы используете.