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

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

0 голосов
/ 09 ноября 2019

Я только изучаю SQL-инъекцию и пытаюсь внедрить свой код на основе PHP (с помощью PHP Phalcon Framework). Я пытаюсь сделать SQL инъекцию в моем логине. Однако, когда я пытаюсь выполнить инъекцию, я не могу сделать это, и я не знаю, вызвано ли это тем, что мой код уже устойчив к SQL-инъекции или я выполняю инъекцию неправильно.

Мой логинраздел содержит адрес электронной почты и пароль. Для раздела электронной почты я вставляю test@test.com' or 1=1 и вставляю какой-то случайный пароль.

Однако появляется сообщение об ошибке, показывающее что-то вроде этого:

Scanning error before ' LIMIT :APL0:' when parsing: SELECT [Test\\Models\\Login].* FROM [TEST\\Models\\Login] WHERE email='test@test.com' 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);
}

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

1 Ответ

3 голосов
/ 09 ноября 2019

Способ написания кода независимо от того, является ли он 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-инъекций.

...