## 表单提交和CSRF
在本课程中,我们将介绍将表单数据提交到服务器的基本工作流程。在此过程中,我们将介绍一个新概念:`CSRF`(跨站点请求伪造)。
### 新手建议
前面几节我们介绍了如何从数据库中获取数据,使用 `Tinker` 添加测试数据。接下来我们在页面中实现添加数据并展示。
> 不论做任何复杂的功能,都是从简单开始,慢慢迭代,这里给新手一个建议,不论做什么都先按照 `路由->控制器->视图` 的顺序来开始。
* 路由 (`routes/web.php`)
```php
Route::get('/create', 'PagesController@create');
```
* 控制器(`PagesController`)
```php
public function create()
{
return view('page.create');
}
```
* 视图(`resources/views/page/create.blade.php`)
```html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<h1>create project</h1>
</body>
</html>
```
好了基本的工作已经做完,如果我们需要获取数据直接在控制器中写逻辑代码就好,然后视图渲染就行,复杂项目肯定不会这样写,这里就不多赘述了。
### 表单提交
我们将表单视图改造一下:
```html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<h1>create project</h1>
<form method="post" action="/">
<div>
<input type="text" name="title">
</div>
<hr>
<div>
<textarea name="description"></textarea>
</div>
<hr>
<div>
<button>提交</button>
</div>
</form>
</body>
</html>
```
添加保存数据路由:
```php
Route::post('/', 'PagesController@store');
```
创建store方法:
```php
public function store()
{
return request()->all();
}
```
OK,做完这些,当我们点击提交按钮是时候,会出现一个 `419` 的报错页面,这里就要介绍一个新概念:`CSRF`(跨站点请求伪造)。 跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。
为了安全,`Laravel` 会自动为每个活跃用户的会话生成一个 `CSRF` 「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。
### CSRF
我们定义了HTML 表单时,都应该在表单中包含一个隐藏的 `CSRF` 标记字段,以便 `CSRF` 中间件可以验证该请求,您可以使用 `@csrf` Blade 指令来生成令牌字段,如下:
```
<form method="post" action="/">
@csrf
...
</form>
```
> 5.7以前版本用 `{{ csrf_field() }}` ,有可能我们的表单来自 `ajax` 请求,官网中同样有解决办法,这里先不介绍,感兴趣的小伙伴可以提前去看看。
当我们添加 CSRF 标记字段后,查看源代码就会发现多了一个名为 `_token` 的隐藏 `input`。
### 保存数据
```
public function store()
{
// return request()->all();
$project = new Project;
$project->title = request('title', '');
$project->description = request('description', '');
$project->save();
return redirect('/');
}
```
### 总结
本节重点理解写功能的时候再Laravel项目中从何开始,掌握表单提交和 `CSRF` 的概念、数据保存及重定向。
> 源码地址:[戳这里](https://gitee.com/iwl/Laravel57-from-scratch/tree/08/)