Я просто изучаю SQL-инъекцию и пытаюсь внедрить свой код на основе PHP (с фреймворком PHP Phalcon). Я пытаюсь сделать SQL-инъекцию в своем логине. Однако, когда я пытаюсь сделать инъекцию, я не могу этого сделать, и я не знаю, вызвано ли это тем, что мой код уже устойчив к SQL-инъекции, или тем, что я делаю инъекцию неправильно.
Мой раздел входа содержит адрес электронной почты и пароль. Для раздела электронной почты я вставляю [email protected]' or 1=1
и случайный пароль.
Однако есть сообщение об ошибке, показывающее что-то вроде этого:
Scanning error before ' LIMIT :APL0:' when parsing: SELECT [Test\\Models\\Login].* FROM [TEST\\Models\\Login] WHERE email='[email protected]' or 1=1 --' LIMIT :APL0: (119)
Вот код подтверждения входа:
public function verifyLogin ($email, $password) {
$records = $this->findFirst("email='$email'");
if ($records && sha1($password)==$records->password) {
return ($records->id);
}
return (false);
}
Как узнать, является ли это моей инъекцией неправильной или код уже надежный? А если закачка все-таки неправильная, как это исправить?
[email protected]' or 1=1 or 1='
для внедрения электронной почты. Это должно привести к правильному коду sql, если ваша инъекция прошла успешно. И измените свой вопрос, если ошибка изменится. - person jh1711   schedule 09.11.2019or 1=
? @jh1711 - person alcantula   schedule 09.11.20191=
не важен, это можно сделать и другими способами. Но открывающая одинарная кавычка необходима, чтобы последний оператор SQL был действительным. Очень простой запрос может выглядеть так:SELECT * from TABLE where email = '$email'
;` Если у вас есть полный контроль над$email
, вы (как злоумышленник) можете закрыть одинарную кавычку и внедрить свою полезную нагрузку; но вам нужно убедиться, что все утверждение действительно. С моей инъекцией оператор where означает: Является ли электронная почта действительной? какая разница! ИЛИ 1=1? это правда. ИЛИ 1 = . какая разница? - person jh1711   schedule 09.11.2019