--- 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 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。