Laravel阻止表单重新提交

时间:2018-10-24 11:18:45

标签: php laravel laravel-5 csrf-protection

我有一种在数据库中添加相册的形式

 {!! Form::open(['method' => 'POST', 'route' => ['admin.album.store'], 'enctype' => 'multipart/form-data', 'id' => 'CreateAlbumForm']) !!}
<input type="hidden" name="_token" value="{{ csrf_token() }}">

// other fields

{!! Form::submit(trans('global.app_save'), ['class' => 'btn btn-danger']) !!}
{!! Form::close() !!}

运行正常。

我需要防止用户多次单击“提交”按钮。我知道可以使用 jquery(在点击时禁用提交按钮)

但是我想在用户未启用JavaScript的情况下使用 csrf保护(服务器端)来实现

经过大量搜索,我发现以下解决方案:

我尝试过的事情

VerifyCsrfToken.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 = ($request->session()->token() == $token) ? TRUE : FALSE;

    if($tokensMatch) $request->session()->regenerateToken();

    return $tokensMatch;
}

然后在文件_token的{​​{1}}数组中添加$dontFlash

app\Http\Requests\FormRequest.php

它给我令牌不匹配错误,但是当我单击提交按钮超过2次时。并将记录插入2次,这是不必要的行为。

第二次尝试同时提交时应该给我错误。

所以简而言之,我需要的是,如果用户单次单击“提交”按钮,则应该插入记录。并且如果他单击提交的次数超过一次,则应给出TokenMismatch错误。

1 个答案:

答案 0 :(得分:1)

You could set a token when you serve the form and check that against the database. When you submit the form, the token is checked and you can't submit it any more. Of course, it is still a good idea to do it front-end too as it is more visual for the user.

https://laracasts.com/discuss/channels/laravel/stopping-multiple-form-submission

只需搜索相关答案并找到答案。希望它会有所帮助。