在我提出这个问题之前,我使用 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 中没有客户端?
保证表单提交唯一性的最直接方法(从阻止某人两次提交提交的意义上说)是生成一个随机令牌并将其存储在会话和隐藏字段中。
如果不匹配,则拒绝该表单,如果匹配,则接受该表单并取消会话密钥。
或者
每次正确验证令牌后,强制 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'];
| 归档时间: |
|
| 查看次数: |
10176 次 |
| 最近记录: |