Безопасная ссылка ha sh для системы сброса пароля - PullRequest
1 голос
/ 06 мая 2020

Просто хочу быть уверенным, что это «правильный путь» и, что наиболее важно, «безопасный ли путь». Я делаю простую форму для тех, кто хочет сбросить пароль (не вошел в систему). Я не хочу использовать способ Laravel (для этого нет специальной базы данных). Просто отправляю зашифрованную ссылку, ссылка действительна в течение 10 минут.

public function sendConfirmationLink(Request $request)
{
    $validatedData = $request->validate([
        'email' => 'required|email|exists:users',
    ]);

    $user = User::where('email', $request->get('email'))->firstOrFail();

    $parameters = [
        'user_id' => $user->id,
        'date' => Carbon::now(),
        'type' => 'password_reset',
    ];

    $passwordResetLink = Crypt::encrypt($parameters);

    SendPasswordResetLink::dispatch($user, $passwordResetLink)->onQueue('high');
}

Позже я расшифровываю это ha sh и меняю пароль.

public function resetPassword(Request $request)
{
    $validatedData = $request->validate([
        'hash' => 'required',
        'new_password' => 'required|string|min:6|confirmed',
    ]);

    try {
        $decrypted = Crypt::decrypt($request->get('hash'));

        $password = Hash::make($request->get('new_password'));

        $user = User::where('id', $decrypted['user_id'])->firstOrFail();

        $user->password = $password;

        $user->save();
    } catch (DecryptException $e) {
        abort(404);
    }
}

Если я прав ... эту «ссылку» будет чрезвычайно сложно взломать, и она действительна всего 10 минут. Является ли это менее безопасным, чем собственная версия Laravel с аналогичным кодом, хранящимся в базе данных?

Да, я знаю, что Laravel Auth может сделать это за меня. Я хочу использовать свой метод не только для сброса пароля, поэтому я ищу ответ, если он безопасен таким образом.

1 Ответ

0 голосов
/ 06 мая 2020

Библиотека Crypt из Laravel использует комбинацию OpenSSL и AES-256-CBC с MAC signing. Я думаю, что для 10-минутного периода этого должно быть достаточно.

Более серьезная проблема заключается в том, что вы не можете «отключить» ссылку после использования. Таким образом, теоретически каждый, у кого есть ссылка, может изменять пароль учетной записи бесконечное количество раз (в течение 10 минут).

Решением этой проблемы может быть добавление текущего пароля ha sh в свою ссылку-ha sh, а затем сравните это. В этом случае смена пароля будет работать только один раз для каждой ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...