laravel默认开启了csrf验证,当form表单提交数据时须带上csrf的token值,校验不通过就返回419错误
csrf验证演示
接下来用代码演示验证流程,首先,在 routes/app.php
中定义路由:
Route::get('form', 'CsrfController@form')->name('csrf.form');
Route::post('post', 'CsrfController@post')->name('csrf.post');
接着创建控制器:
$ php artisan make:controller CsrfController
app/Http/Controllers/CsrfController.php
创建两个方法,一个显示表单,一个提交表单
# ...
class CsrfController extends Controller
{
public function form()
{
return view('csrf.form');
}
public function post(Request $request)
{
dd($request->post());
}
}
用bootstrap创建表单视图:resources/views/csrf/form.blade.php
<div class="container mt-5">
<form method="post" action="{{ route('csrf.post') }}">
<div class="form-group">
<label for="name">用户名</label>
<input type="text" class="form-control" name="name" id="name" placeholder="输入用户名">
</div>
<div class="form-group">
<label for="pwd">密码</label>
<input type="password" class="form-control" name="password" id="pwd" placeholder="输入密码">
</div>
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
提交表单,会报419错误:
这是因为表单没有携带csrf验证所需要的token,修改form表单:
<form method="post" action="{{ route('csrf.post') }}">
@csrf
<!-- ... -->
</form>
刷新页面,可看到@csrf
解析为以下代码:
再次提交表单,便可打印出表单数据:
忽略csrf验证
当我们与第三方接口交互时,不可能让第三方接口从我们的服务器获取token,此时csrf就会误伤友军。因此,我们有时需要将csrf验证取消
csrf验证是一个独立的中间件,如果我们在app/Http/Kernel.php
的$middlewareGroups
将其屏蔽,就不会再对任何请求进行csrf验证,这种方法自然是不可取的
我们只需要在app/Http/Middleware/VerifyCsrfToken.php
中间件的$except
属性中添加要过滤的路由,即可使这些路由跳过验证
protected $except = [
'/post'
];
此时将form表单中的@csrf
删除,再提交表单,并不会触发419错误