在一个按钮级别中阻止多次提交

时间:2018-05-19 03:50:36

标签: 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);" />

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

1 个答案:

答案 0 :(得分:1)

保证表单提交唯一性的最简单方法(在某种程度上阻止某人混合提交两次)是生成随机令牌并将其存储在会话和隐藏字段中。

如果不匹配,请拒绝表单,如果匹配,则接受表单并核对会话密钥。

OR

每次正确验证令牌后,强制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;
}

如果您验证表单并且验证失败,旧数据将传回表单。因此,您需要确保不通过将_token添加到$dontFlash

中的app/Exceptions/Handler.php数组来传回旧令牌

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