## 表單提交和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/)