防止一键式 Laravel 多次提交

Abd*_*uro 3 php laravel

在我提出这个问题之前,我使用 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);" />
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有另一种方法可以防止在 laravel 中没有客户端?

Sau*_*abh 9

保证表单提交唯一性的最直接方法(从阻止某人两次提交提交的意义上说)是生成一个随机令牌并将其存储在会话和隐藏字段中。

如果不匹配,则拒绝该表单,如果匹配,则接受该表单并取消会话密钥。

或者

每次正确验证令牌后,强制 Laravel 重新生成新的会话令牌。(简单的办法)

要实现这一点,请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;
}
Run Code Online (Sandbox Code Playgroud)

如果您验证表单并且验证失败,旧数据将被传递回表单。所以你需要确保不要通过添加_token到$dontFlash数组中来传回旧令牌app/Exceptions/Handler.php

protected $dontFlash = ['password', 'password_confirmation', '_token'];