Предотвратить множественную отправку одним нажатием кнопки - PullRequest
0 голосов
/ 19 мая 2018

Прежде чем я задам этот вопрос, я использую метод javascript, чтобы предотвратить многократную отправку в моем шаблоне блэйда.Но я знаю, что на стороне клиента все еще возможно получить атаку.

Это мой код JavaScript

<script>
    function submitForm(btn) {
        // disable the button
        btn.disabled = true;
        // submit the form    
        btn.form.submit();
    }
</script>

<input id="submitButton" type="button" value="Submit" onclick="submitForm(this);" />

Мой вопрос заключается в том, есть ли другой способ предотвращения без стороны клиента в laravel?

1 Ответ

0 голосов
/ 19 мая 2018

Самый простой способ гарантировать уникальность отправки формы (в смысле прекращения передачи кем-либо дважды) - это сгенерировать случайный токен и сохранить его в сеансе И в скрытом поле.

Если он не совпадает, отклоните форму, если она совпадает, примите форму и сбросьте ключ сеанса.

ИЛИ

Вынудите 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'];

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