passwordResetToken expiration time

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

passwordResetToken expiration time

Сообщение Vasiliy Baukin »

Всем привет.

Исследуя код шаблона advanced заметил, что код восстановления пароля пользователя генерится так:

Код: Выделить всё

    /**
     * Generates new password reset token
     */
    public function generatePasswordResetToken()
    {
        $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
    }
После чего сохраняется как есть в БД.

А затем проверяется так:

Код: Выделить всё

    public static function isPasswordResetTokenValid($token)
    {
        if (empty($token)) {
            return false;
        }

        $timestamp = (int) substr($token, strrpos($token, '_') + 1);
        $expire = Yii::$app->params['user.passwordResetTokenExpire'];
        return $timestamp + $expire >= time();
    }
Т.к. каждый раз используется время в открытом виде. Получается, что пользователь (потенциально - злоумышленник) может легко манипулировать временем истечения действия кода.

Насколько серьезна эта потенциальная уязвимость?
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: passwordResetToken expiration time

Сообщение Onotole »

И как он сможет этим манипулировать?
Vasiliy Baukin
Сообщения: 102
Зарегистрирован: 2011.02.04, 12:47

Re: passwordResetToken expiration time

Сообщение Vasiliy Baukin »

Ошибся.

Оно проверяется так:

Код: Выделить всё

    public static function findByPasswordResetToken($token)
    {
        if (!static::isPasswordResetTokenValid($token)) {
            return null;
        }

        return static::findOne([
            'password_reset_token' => $token,
            'status'=>self::STATUS_ACTIVE
        ]);
    }
Соответственно, уязвимости нет, т.к. поиск идет по полному ключу вместе с временным штампом.

Вопрос закрыт.
Ответить