怎么防止跨站請(qǐng)求偽造攻擊(CSRF)?
時(shí)間:2023-04-24 09:45:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-04-24 09:45:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)
怎么防止跨站請(qǐng)求偽造攻擊(CSRF)?:
一、CSRF 是什么?
跨站請(qǐng)求偽造(英語(yǔ):Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。
二、實(shí)際攻擊場(chǎng)景
下面用一個(gè)銀行網(wǎng)站的轉(zhuǎn)賬功能,說(shuō)明攻擊原理。備注:涉及到 URL 等信息都是虛構(gòu)。
1、登錄賬號(hào)
- 正常登錄了一家銀行網(wǎng)站,查看其后臺(tái)信息后,沒(méi)有退出登錄;
- 假設(shè)這家銀行操作轉(zhuǎn)賬的 URL 是:
https://bank.example.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
2、惡意鏈接
- 此時(shí)你看到其他網(wǎng)站的一個(gè)誘導(dǎo)鏈接,你下意識(shí)點(diǎn)開(kāi)了;
- 誘導(dǎo)鏈接中包含惡意代碼(用 轉(zhuǎn)賬鏈接 替代 真實(shí)圖片鏈接)
<img src="https://bank.example.com/withdraw?account=Alice&amount=1000&for=Badman" />
3、攻擊完成
- 點(diǎn)擊鏈接后,瀏覽器會(huì)打開(kāi)
<img>
中 src 屬性的鏈接來(lái)加載圖片,但實(shí)際上執(zhí)行了轉(zhuǎn)賬操作; - 轉(zhuǎn)賬請(qǐng)求所用電腦、瀏覽器、ip等環(huán)境跟登錄賬號(hào)時(shí)的環(huán)境一模一樣,銀行網(wǎng)站后臺(tái)會(huì)認(rèn)為這就是你本人在操作,所以驗(yàn)證通過(guò),直接轉(zhuǎn)賬。
三、防止 CSRF 攻擊
服務(wù)器端對(duì)請(qǐng)求做一次身份驗(yàn)證,拒絕掉無(wú)法通過(guò)驗(yàn)證的請(qǐng)求,即可方式 CSRF 攻擊。
1、第一種方法:驗(yàn)證碼
給手機(jī)發(fā)送數(shù)字驗(yàn)證碼、圖形化驗(yàn)證碼讓客戶識(shí)別、讓用戶再次輸入賬號(hào)密碼等進(jìn)行再次身份驗(yàn)證。
2、第二種方法:Token
1、服務(wù)器生成一個(gè) CSRF token; 2、客戶端(瀏覽器) 提交表單中含有 CSRF token 信息; 3、服務(wù)端接收 CSRF token 并驗(yàn)證其有效性。
攻擊者有可能在上面客戶端中拿到 CSRF token,但是攻擊者只能使用 JavaScript 來(lái)發(fā)起請(qǐng)求,如果服務(wù)器不支持 CORS(跨域資源),那么攻擊者的
跨域 JavaScript 請(qǐng)求
是會(huì)被服務(wù)器拒絕,達(dá)到防止 CSRF 攻擊目的。
- Node.js 項(xiàng)目中推薦使用
csurf
,具體使用方法,看這里!
四、參考文檔
- 怎么防止跨站請(qǐng)求偽造攻擊(CSRF)?
關(guān)鍵詞:攻擊,請(qǐng)求,防止,偽造