一.表单伪造
-
之前一直用的 GET 请求方式,而表单可以实现 POST 方式,我们来实验下:
-
先在 TaskController 创建两个方法,一个表单页,一个接受表单数据路由;
public function form() { return view('form');
}
//表单页
Route::get('task/form', 'TaskController@form');
//接受表单数据
Route::any('task/getform', function () { return \Illuminate\Support\Facades\Request::method();
});
- 表单页以 post 发送,路由也使用 post 接受,以下表单提交会出现 419 错误;
<form action="/task/getform" method="post"> 用户名:<input type="text" name="user"> <button type="submit">提交</button>
</form>
- 这是为了避免被跨站请求伪造攻击,框架提供了 CSRF 令牌保护,请求时验证;
<input type="hidden" name="_token" value="{{csrf_token()}}">
- 表单可以实现 POST 提交方式,那其它提交方式该如何实现呢?可以采用伪造技术;
<input type="hidden" name="_method" value="PUT">
- 对于 CSRF 令牌保护和表单伪造提交方式,也支持快捷方式的声明,如下:
@csrf
@method('PUT')
-
如果我们想让某些 URL 关闭 csrf 验证,可以设置 csrf 白名单;
-
白名单具体设置位置在:中间件目录下的 VerifyCsrfToken.php 文件;
-
当然,不建议直接注释掉这个验证 csrf 功能的中间件;