解決方法:1、利用laravel自動(dòng)為每個(gè)用戶(hù)Session生成了一個(gè)“csrf Token”,該Token可用于驗(yàn)證登錄用戶(hù)和發(fā)起請(qǐng)求者是否是同一人,如不是則請(qǐng)求失敗;2、提供了一個(gè)全局幫助函數(shù)“csrf_token”來(lái)獲取Token值,只需在視圖提交表單中添加token代碼即可,語(yǔ)法為“”。
本文操作環(huán)境:Windows10系統(tǒng)、Laravel9版、Dell G3電腦。
csrf攻擊在laravel中的解決方法
CSRF是跨站請(qǐng)求偽裝(Cross-site request forgery)的英文縮寫(xiě);
?Laravel框架中避免CSRF攻擊很簡(jiǎn)單:
1、Laravel自動(dòng)為每個(gè)用戶(hù)Session生成了一個(gè)CSRF Token,該Token可用于驗(yàn)證登錄用戶(hù)和發(fā)起請(qǐng)求者是否是同一人,如不是則請(qǐng)求失敗。(原理和驗(yàn)證碼是一致的。)
2、 Laravel提供了一個(gè)全局幫助函數(shù)csrf_token來(lái)獲取Token值,因此只需在視圖提交表單中添加如下html代碼即可在請(qǐng)求中帶上Token:
<input>">
Laravel中如何避免CSRF攻擊
案例:通過(guò)案例實(shí)現(xiàn)csrf的機(jī)制驗(yàn)證
1、創(chuàng)建兩個(gè)路由,一個(gè)用于展示表單(get),另外處理請(qǐng)求(post)
Route::get('test6','HomeTestController@test6');Route::post('test7','HomeTestController@test7');
2、創(chuàng)建需要的方法
public function test6(){ return view('home.test.test6'); } public function test7() { return "請(qǐng)求提交成功"; }
3、創(chuàng)建需要的簡(jiǎn)易表單
4、提交效果(報(bào)錯(cuò)頁(yè)面)
結(jié)論:通過(guò)剛才的案例,說(shuō)明在laravel中csrf驗(yàn)證機(jī)制默認(rèn)是開(kāi)啟的。
5、解決報(bào)錯(cuò)問(wèn)題(如何通過(guò)csrf驗(yàn)證)
解決思路:帶上csrf需要token值,隨著請(qǐng)求傳遞給后續(xù)的方法
<form action="/home/test/test7" method="post"> 用戶(hù)名:<input type="text" name="username"><br> <input type="hidden" name="_token" value="{{csrf_token()}}"> {{csrf_field()}} <input type="submit" value="提交"></form>
針對(duì)csrf_token方法的簡(jiǎn)化:{{csrf_field()}}
具體的表現(xiàn)形式:
兩者的區(qū)別:
Csrf_token只是輸出token的值
Csrf_field輸出了一個(gè)整個(gè)的input隱藏域
在后期使用的時(shí)候怎么選擇:大部分情況下可以自己根據(jù)情況選擇。但是有一個(gè)情況下開(kāi)發(fā)者是沒(méi)有選擇權(quán)限的,必須需要使用csrf_token的,這個(gè)情況就是使用異步提交表單的方式。
從CSRF驗(yàn)證中排除例外路由
并不是所有請(qǐng)求都需要避免CSRF攻擊,比如去第三方API獲取數(shù)據(jù)的請(qǐng)求。
可以通過(guò)在VerifyCsrfToken(app/http/Middleware/VerifyCsrfToken.php)中間件中將要排除的請(qǐng)求URL添加到$except屬性數(shù)組中:
通過(guò)編寫(xiě)配置設(shè)置例外:
單個(gè)路由排除寫(xiě)法
'home.test.test6',
多個(gè)元素之間通過(guò)“,”分割,遵循數(shù)組寫(xiě)法。
'home.test.test6','home.test.test7'
如果需要排除全部路由使用csrf的話,則可以寫(xiě)成:
'*'
【相關(guān)推薦:laravel視頻教程】