Post CSRF 錯誤
最后更新于:2022-04-01 23:12:23
# POST CSRF 錯誤
當我們在使用 Unit test 做 POST 測試時,測試的程式可能像:
~~~
'kejyun@gmail.com',
'name'=>'KeJyun'
];
// 傳送參數
$response = $this->call('POST', '/signup', $parameters);
$this->assertEquals(200, $response->getStatusCode());
}
}
~~~
在執行單元測試後,你會收到一個 `TokenMismatchException` 的例外錯誤,這個部分是 Middleware VerifyCsrfToken 的驗證錯誤
這是因為 Laravel 5 在所有的 `POST`、`PUT`、`DELETE` 的路由方法中,都會預設加入 CSRF Token 的檢查,他會檢查 POST 過來的資料中 `_token` 的資料值與 Session 中的 token 是否相符,或是驗證標頭中的 `X-CSRF-TOKEN` 是否相符。
所以在我們每一次做 `POST`、`PUT`、`DELETE` 的請求時,我們都必須要將 CSRF Token 帶入檢查,才能執行後面的程式動作,我們可以用這樣的方式帶入 CSRF Token:
~~~
csrf_token(),
'email'=>'kejyun@gmail.com',
'name'=>'KeJyun'
];
// 傳送參數
$response = $this->call('POST', '/signup', $parameters);
$this->assertEquals(200, $response->getStatusCode());
}
}
~~~
在使用 `csrf_token()` 方法時,都必須要先使用 `Session::start();` 將 Session 開啟,以紀錄當時的 CSRF Token 做驗證,並將 `_token` 當作參數傳送到 `POST`、`PUT`、`DELETE` 的路由當中,就可以正常執行單元測試了!
### 參考資料
- [HTTP 路由 - Laravel.tw](http://laravel.tw/docs/5.0/routing#csrf-protection)
- [Testing Laravel 5 Routes with CSRF Protection Using PHPUnit](http://davejustdave.com/2015/02/08/laravel-5-unit-testing-with-csrf-protection/)
';