Я все время использую слой ORM в базах данных, поэтому я не возражаю против инъекций SQL, но друг дал мне эту задачу, и я до сих пор не знаю, как ее решить.
Я знаю, что PHP-скрипт просто проверяет, возвращен ли запрос! = Null (имя пользователя соответствует введенному имени пользователя & пароль найден).
Сам запрос в PHP выглядит так:
$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'";
Какой лучший способ архивировать возврат этого запроса! = Ноль ИЛИ получение действительных данных для входа (имя пользователя) & пароль). Пароль хранится в простой базе данных. Я знаю, что хранить обычные файлы плохо, и я знаю, что использование PDO — это хорошо, но я понятия не имею, как решить эту забавную задачу, которую он мне дал, возможно, потому что я все время использую PDO.
Скажем, у нас есть эти две входные переменные:
$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;--'
Увидеть этот ответ за то, как злоумышленник начнет работать с этим путем введения в запрос.