之前所提及XSS攻擊最終都是將惡意腳本注入到頁(yè)面中,進(jìn)行后續(xù)操作。還有另一種類型,跨站請(qǐng)求偽造(CSRF)攻擊。
CSRF攻擊
- 在用戶登錄了A網(wǎng)站后,擁有了A網(wǎng)站的登錄狀態(tài)。
- 這時(shí)就可進(jìn)行一些和當(dāng)前賬戶相關(guān)的請(qǐng)求,偽造請(qǐng)求就可模擬真實(shí)用戶進(jìn)行操作。
- 偽造請(qǐng)求通常在被誘導(dǎo)打開(kāi)的第三方網(wǎng)站進(jìn)行。
偽造請(qǐng)求的形式
- 偽造請(qǐng)求在打開(kāi)的第三方頁(yè)面中進(jìn)行,可能會(huì)隱藏在各種加載第三方資源的方式中。
- 比如img標(biāo)簽src屬性、表單數(shù)據(jù)的提交、誘導(dǎo)性超鏈接等,get類型、post類型都可偽造。
防止CSRF攻擊
依據(jù)上述CSRF特點(diǎn):
- 基于用戶登錄狀態(tài)。
- 在第三方頁(yè)面?zhèn)卧煺?qǐng)求。
防范可有如下方面:
Cookie中SameSite字段
- 偽造的請(qǐng)求之所以可以利用用戶登錄狀態(tài),是因?yàn)榘l(fā)送請(qǐng)求時(shí)會(huì)攜帶Cookie信息,而Cookies中常常存有用戶登錄狀態(tài)。
- 在Cookie字段中設(shè)置SameSite字段值,聲明是發(fā)送請(qǐng)求時(shí)是否允許攜帶Cookie。
SameSite字段值
Strict
完全禁止第三方的Cookie發(fā)送。
Lax
額外允許第三方網(wǎng)站發(fā)起Get請(qǐng)求時(shí)發(fā)送Cookie,是當(dāng)前的默認(rèn)值。
None
不做任何限制,任意情況下都可發(fā)送Cookie,是以前的默認(rèn)值。
驗(yàn)證請(qǐng)求的來(lái)源站點(diǎn)
- 如果偽造請(qǐng)求成功發(fā)送到了服務(wù)器端,服務(wù)器可檢驗(yàn)請(qǐng)求的來(lái)源是否可靠,是否有偽造的可能性。
- 可通過(guò)報(bào)文的Origin字段和Referer字段獲取到請(qǐng)求的來(lái)源。
- 其中,Origin字段不包含來(lái)源的路徑信息,Referer包含完整的路徑信息。
- 優(yōu)先判斷Origin更為合理。
CSRF Token
- 用戶在請(qǐng)求頁(yè)面時(shí),服務(wù)端可生成Token(也就是一串字符),插入到返回的頁(yè)面中。
- 在發(fā)送請(qǐng)求時(shí),需攜帶頁(yè)面中的Token。而第三方網(wǎng)站獲取不到頁(yè)面中的內(nèi)容,獲取不到Token。
- 服務(wù)端接收到請(qǐng)求時(shí),驗(yàn)證Token,不正確時(shí)拒絕請(qǐng)求。