本文主要內(nèi)容有三點:
1. WHAT?
1-1. 什么是跨站請求偽造 CSRF途样,會造成什么后果鼻百?
2. WHY?
2-1. 為什么CSRF會有 1 中提及的危害,如何實現(xiàn)垫卤?
3. HOW?
3-1 如何防范CSRF?
3-2 CSRF與XSS結(jié)合
3-3 cookie的samesite屬性
1-1 什么是跨站請求偽造 CSRF父丰,會造成什么后果?
跨站請求偽造:CSRF
或XSRF
(Cross Site Request Forgery)
攻擊者盜用
目標網(wǎng)站的合法
用戶的身份
,向目標網(wǎng)站發(fā)送合法請求
蛾扇。
2-1 為什么CSRF會有 1 中提及的危害攘烛,如何實現(xiàn)?
CSRF攻擊舉例:
1镀首、 用戶登錄了xx社交平臺坟漱,xx社交平臺在用戶本地cookie保存表征身份的token;
2更哄、用戶點擊郵件中鏈接或其他方式進入攻擊者的網(wǎng)站aahack.com芋齿,攻擊者網(wǎng)站aahack.com向xx社交平臺靜默發(fā)出 關(guān)注、點贊成翩、投票觅捆、轉(zhuǎn)賬等請求,由于攜帶了合法用戶的xx社交平臺的全部cookie麻敌,xx平臺認可為合法用戶的操作栅炒;
從CSRF攻擊的例子可以看出,若合法網(wǎng)站在cookie中存儲用戶的身份token且以此token作為用戶身份鑒權(quán)的部分(僅以此鑒權(quán)或結(jié)合其他字段鑒權(quán))术羔,則此網(wǎng)站一定存在CSRF的漏洞赢赊。無論在何頁面向此合法網(wǎng)站發(fā)送請求,都可以攜帶所有此網(wǎng)站已存在的所有cookie级历。
即實現(xiàn)CSRF有三點要素:
- 合法目標網(wǎng)站在cookie中存儲用戶的身份token且以此token作為用戶身份鑒權(quán)(僅以此鑒權(quán)或結(jié)合其他字段鑒權(quán)释移,結(jié)合其他字段鑒權(quán)的情況可參考
3-2 CSRF與XSS結(jié)合
); - 合法用戶登陸了該合法目標網(wǎng)站寥殖,本地cookie中存有該token;
- 引導用戶進入攻擊網(wǎng)站 玩讳。
3-1 如何防范CSRF?
1. Server端驗證請求來源
Server端驗證Referer 和 Origin(但Origin只存在于post請求,Referer 和 Origin都可能為空扛禽,Referer可以被偽造)
2. 增加鑒權(quán)參數(shù)csrf-token
【2-1】csrf-token有兩種存放方式
在頁面中或在cookie中锋边,若服務端渲染的頁面可放在頁面中,前端渲染的頁面可以在response中set cookie编曼。
注意服務端Access-Control-Allow-Origin 不要設(shè)置為*
豆巨,防止CSRF攻擊頁面請求目標網(wǎng)站頁面 通過解析respose得到頁面中存放的csrf-token或response header中的set-cookie
【2-2】 請求時將csrf-token加在header中
若通過xss等方式獲取到了csrf-token,csrf-token作為自定義字段加在header中時 該請求變成跨域的復雜請求掐场,瀏覽器會先發(fā)Options嗅探請求往扔,服務端可通過Access-Control-Allow-Origin和Access-Control-Allow-Methods進行攔截
3-2 CSRF與XSS結(jié)合
CSRF
可在瀏覽器中向合法地址的請求中攜帶合法用戶的全部cookie,但不能操作cookie的值熊户,cookie之外的鑒權(quán)信息也獲取不到(除非合法地址的服務端特別設(shè)置了Access-Control-Allow-Origin:*)萍膛;
XSS
可以獲取到頁面上幾乎所有的鑒權(quán)信息包含cookie和存儲在頁面上的信息,但是獲取不到httpOnly屬性被設(shè)置為true的cookie
(防xss還可以在response增加防xss的header頭x-xss-protection:1;mode=block // 開啟瀏覽器過濾xss,發(fā)現(xiàn)xss攻擊不刪除頁面嚷堡,只是阻止頁面加載
content-security-policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none' //現(xiàn)代瀏覽器可以通過設(shè)置content-security-policy禁止不安全的內(nèi)聯(lián));
二者結(jié)合
則可以獲取到全量的cookie 和頁面信息蝗罗,并可以使用httpOnly屬性不為true的cookie
3. cookie中存儲的鑒權(quán)參數(shù)需設(shè)置httpOnly屬性為true
3-3 cookie的屬性samesite
此屬性為17年新定義艇棕,只有較新版本的瀏覽器支持
Strict、Lax
Strict:當發(fā)生跨站請求時串塑,瀏覽器發(fā)出的請求不會攜帶目標網(wǎng)站的cookie沼琉;
Lax:當用戶主動點擊而發(fā)生跨站請求時,瀏覽器發(fā)出的請求會攜帶目標網(wǎng)站的cookie桩匪;
tips
: 跨站不是跨域打瘪, 是根據(jù)Public Suffix List 來判斷
4. 合理設(shè)置網(wǎng)站cookie的samesite屬性
綜上,防范CSRF可參考四點:
1. Server端驗證請求來源
2. 增加鑒權(quán)參數(shù)csrf-token
3. cookie中存儲的鑒權(quán)參數(shù)需設(shè)置httpOnly屬性為true
4. 合理設(shè)置網(wǎng)站cookie的samesite屬性