Самый простой способ гарантировать уникальность отправки формы (в смысле прекращения передачи кем-либо дважды) - это сгенерировать случайный токен и сохранить его в сеансе И в скрытом поле.
Если он не совпадает, отклоните форму, если она совпадает, примите форму и сбросьте ключ сеанса.
ИЛИ
Вынудите Laravel восстановить новуюмаркер сеанса после каждой проверки токена.(Easy Way Out)
Для этого создайте новую функцию tokensMatch()
в app/Http/Middleware/VerfiyCsrfToken.php
(которая перезапишет унаследованную).Примерно так:
protected function tokensMatch($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (!$token && $header = $request->header('X-XSRF-TOKEN')) {
$token = $this->encrypter->decrypt($header);
}
$tokensMatch = hash_equals($request->session()->token(), $token);
if($tokensMatch) $request->session()->regenerateToken();
return $tokensMatch;
}
В случае, если вы проверите форму, и проверка не пройдена, старые данные будут переданы обратно в форму.Таким образом, вы должны убедиться, что не вернули старый токен, добавив _token
к массиву $dontFlash
в app/Exceptions/Handler.php
protected $dontFlash = ['password', 'password_confirmation', '_token'];