在我提出此问题之前,我使用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?
答案 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'];