Теория внедрения SQL
Я все время использую слой ORM в базах данных, поэтому я не возражаю против инъекций SQL, но друг дал мне эту задачу, и я до сих пор не знаю, как ее решить.
Я знаю, что PHP-скрипт просто проверяет, возвращен ли запрос!= Null (имя пользователя соответствует введенному имени пользователя и паролю).
Сам запрос в PHP выглядит так:
$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'";
Каков наилучший способ архивирования возврата этого запроса!= Null ИЛИ получение действительных данных для входа (имя пользователя и пароль). Пароль хранится в простой базе данных. Я знаю, что хранить обычные файлы плохо, и я знаю, что использовать PDO - это хорошо, но я понятия не имею, как решить эту забавную задачу, которую он мне дал, возможно, потому что я все время использую PDO.
2 ответа
Скажем, у нас есть эти две входные переменные:
$name = "iam";
$password = "aninjection";
Что приводит к этому запросу:
$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection'";
И скажем теперь, мы добавим это к $password
переменная:
$password = "aninjection' OR 1='1";
Что приводит к:
$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection' OR 1='1'";
Этот запрос теперь приведет к true
и показать каждое имя из пользовательской таблицы. Это конечно основной пример. Мы также могли бы принести больше вреда, опустив целые столы.
Если вы хотите получить пароли, вы должны ввести
$name = "whatever";
$password = "' OR '1'='1' UNION ALL SELECT password from users;--";
Это тогда сделало бы запрос
SELECT name FROM users WHERE name='whatever' AND password='' OR '1'='1' UNION ALL SELECT password from users;--'
Посмотрите этот ответ, чтобы узнать, как злоумышленник начнет работать с этим путем введения в запрос.