Теория внедрения 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;--'

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

Другие вопросы по тегам