SQL-инъекция в PHP Phalcon

Я просто изучаю 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);
}

Как узнать, является ли это моей инъекцией неправильной или код уже надежный? А если закачка все-таки неправильная, как это исправить?


person alcantula    schedule 09.11.2019    source источник
comment
Тем не менее, включение кода, в котором вы фактически строите свое утверждение, было бы неплохо. По сути, Phalcon использует только одиночные запросы, поэтому вы можете выполнять только один оператор за один вызов. Если вы используете привязку параметров, вы должны быть на безопасном сайте.   -  person maio290    schedule 09.11.2019
comment
Я добавил код @maio290   -  person alcantula    schedule 09.11.2019
comment
Попробуйте: [email protected]' or 1=1 or 1=' для внедрения электронной почты. Это должно привести к правильному коду sql, если ваша инъекция прошла успешно. И измените свой вопрос, если ошибка изменится.   -  person jh1711    schedule 09.11.2019
comment
закачка удалась, но зачем нужно добавлять дополнительные or 1=? @jh1711   -  person alcantula    schedule 09.11.2019
comment
Дополнительный 1= не важен, это можно сделать и другими способами. Но открывающая одинарная кавычка необходима, чтобы последний оператор SQL был действительным. Очень простой запрос может выглядеть так: SELECT * from TABLE where email = '$email';` Если у вас есть полный контроль над $email, вы (как злоумышленник) можете закрыть одинарную кавычку и внедрить свою полезную нагрузку; но вам нужно убедиться, что все утверждение действительно. С моей инъекцией оператор where означает: Является ли электронная почта действительной? какая разница! ИЛИ 1=1? это правда. ИЛИ 1 = . какая разница?   -  person jh1711    schedule 09.11.2019
comment
Несмотря на то, что код, который вы написали, на самом деле не защищен от sql-инъекций, phalcon orm частично предотвратит это - ограничение операции до одного, например, невозможно поместить туда запрос на обновление или удаление.   -  person Juri    schedule 09.11.2019


Ответы (1)


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

Если это последнее, вы всегда можете привязать свои параметры:

public function verifyLogin ($email, $password) {
    $record = $this->findFirst(
        'conditions' => 'email = :email:',
        'bind'       => [
            'email' => $email,
         ],
    );

    if ($record && sha1($password) == $records->password) {
        return ($records->id);
    }

    return false;
}

В приведенном выше коде используются связанные параметры — функция PDO, обеспечивающая лучшую защиту от SQL-инъекций.

person Nikolaos Dimopoulos    schedule 09.11.2019
comment
Привязка параметров не является функцией PDO, это функция базы данных;) - person maio290; 09.11.2019