---
tags: Laravel, csrf, token, expire
---
# Laravel-caffeine 讓你的 CSRF Token 永不過期 ——genealabs/laravel-caffeine
CSRF 跨站請求偽造 是一種常見的 Web 攻擊方式,通常情況下會在 Form 表單頁面增加 CSRF Token 來保護項目安全。
CSRF 例子
Laravel 中使用時非常方便的,中間件會自動的驗證,只有 CSRF Token 正確才能提交表單。
```php=
$ php artisan make:auth
routes/web.php
Route::group(['middleware' => 'auth'], function() {
Route::get('form', function() {
return view('form');
});
Route::post('form', function() {
dump(app('request')->all());
});
});
$ touch resources/views/form.blade.php
```
#### 寫一個簡單的表單。
```php=
resources/views/form.blade.php
@extends('layouts.app')
@section('content')
<form method="POST" action="/form">
{{ csrf_field()}}
<textarea name="test"></textarea>
<button type="submit">submit</button>
</form>
@endsection
```
這是一個非常簡單的例子,顯示表單頁面的時候,Token 會保存在 Session 中,提交表單的時候回自動進行驗證。
測試 Session 失效
但是有的時候 CSRF Token 會帶來一些麻煩,因為這個 Token 放在 Session 中,它的有效期就是 Session 的有效期,默認是 120 分鐘。如果我們在填寫一個非常大的表單,或者在寫一篇很長的博客,可能經常會寫到一半,然後去幹其他的事情,等我們再次回來編輯表單,Session 很有可能過期,必須刷新頁面,重新填寫表單。
來測試一下,這裡要求我們長時間沒有操作,導致 Session 過期,但是因為普通網站都會有記住用戶的功能,Session 過期了,但其實用戶依然是登錄狀態。
重新登錄一下。
我們可以將 env 中的 SESSION_LIFETIME 調小,或者手動刪除 Session 文件來模擬 session 過期。
`$ rm storage/framework/sessions/*`
為了讓用戶體驗更好,防止上面情況的發生,可以使用這個擴展包 github.com/GeneaLabs/laravel-caffe... 。
## 安裝
```
$ git checkout -b caffeine
$ composer require genealabs/laravel-caffeine
```
安裝上擴展包就已經在工作了,它會查看頁面中是否存在 CSRF Token,如果存在咋會在頁面中添加一段 JS。
這段 JS 的作用就是不斷的發送 ajax 請求,請求不用返回任何內容,擴展包已經注冊了一個路由,返回了 204,只是為了,防止了 Session 的過期。每次請求都會記錄下來請求的時間,如果上一次請求到現在的時間間隔,接近於 Session 過期時間了,那麼就直接刷新頁面。
請求的間隔,請求的地址這些都是可以配置的。
```php=
config/genealabs-laravel-caffeine.php
'drip-interval' => 5000,
```
為了看清楚 Session 的過期時間,我們可以使用 redis 作為 Session 驅動,然後間隔調小,5 分鐘過期。
```php=
.env
SESSION_DRIVER=redis
SESSION_LIFETIME=5
```
例如我們修改一下配置,5 秒發送一個請求。
現在其實是有問題的,Session 的過期時間依然沒有被刷新
### Bug
這裡其實有一個 Bug,擴展包注冊路由的時候,因為某些判斷的問題,導致 web 中間件組沒有被注冊上,這樣 Session 中間件沒有執行,導致 Session 過期時間沒有被重置。
github.com/GeneaLabs/laravel-caffe...
你可以關注一下這個 Bug,或者可以手動處理一下,自己寫一個路由即可。
```php=
routes/web.php
Route::get('drip', function() {
return response(null, 204);
});
```
```php=
config/genealabs-laravel-caffeine.php
//'route' => 'genealabs/laravel-caffeine/drip', // Customizable end-point URL
'route' => 'drip', // Customizable end-point URL
```
這樣就行了,不斷請求我們自己的路由,返回 204,再次測試就沒有問題了。
不全局使用
如果某個頁面你不想使用這個擴展包,可以在頁面中增加一個標簽 `<meta name="caffeinated" content="false">。`
如果不想全局使用,可以修改配置。
```php=
config/genealabs-laravel-caffeine.php
'use-route-middleware' => true,
```
這樣就可以通過手動使用 caffeinated 中間件來使用擴展包。
代碼版本控制
```
$ git add -A
$ git commit -m 'genealabs/laravel-caffeine'
```
---
原文作者:liyu001989
转自链接:https://learnku.com/courses/laravel-package/2019/laravel-caffeine-makes-your-csrf-token-never-expire-genealabslaravel-caffeine/3974
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。