黑客通過CSRF攻擊,讓我這個(gè)月吃土了
2024-06-05 加入收藏
歡迎訪問Python3分鐘系列。花3分鐘時(shí)間,學(xué)習(xí)或溫習(xí)一個(gè)Python知識(shí)點(diǎn)。今天是第230。
早些年老有一些釣魚郵件來“釣”我,然而我確實(shí)也中過一次招。那就是...
什么是CSRF?
CSRF是跨站請(qǐng)求偽造(Cross-Site Request Forgery
)的縮寫,是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法。
很多小伙伴很容易將CSRF與XSS(
Cross Site Scripting
) 混淆,XSS利用的是用戶對(duì)指定網(wǎng)站的信任,而CSRF利用的是網(wǎng)站對(duì)用戶網(wǎng)頁(yè)瀏覽器的信任。(面試題)
CSRF攻擊利用的是沖著瀏覽器分不清發(fā)起請(qǐng)求是不是真正的用戶本人。 Web端的簡(jiǎn)單的身份驗(yàn)證只能保證請(qǐng)求發(fā)自某個(gè)用戶的瀏覽器,卻不能保證請(qǐng)求本身是用戶自愿發(fā)出的。
一次CSRF的攻擊流程
我登錄某個(gè)購(gòu)物網(wǎng)站(例如:
shop.com
),并保留了用戶憑證(Cookie);攻擊者通過某種手段誘騙訪問了一個(gè)模仿
shop.com
偽造的網(wǎng)站(例如:shop.vip
);shop.vip
向shop.com
發(fā)送請(qǐng)求;shop.com
接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是我的憑證(因?yàn)槲业挠脩魬{證對(duì)shop.com
是有效的),所以誤以為是我自己發(fā)送的請(qǐng)求。shop.com
以我的名義執(zhí)行了這個(gè)請(qǐng)求。攻擊完成,攻擊者通過這個(gè)方式輕松盜刷了我的購(gòu)物余額。
如何防范CSRF攻擊?
我們用Python的Web框架Django說明如何防范CSRF攻擊。
在Django中,CSRF保護(hù)是通過中間件來實(shí)現(xiàn)的。 具體來說,django.middleware.csrf.CsrfViewMiddleware
中間件負(fù)責(zé)在請(qǐng)求處理之前和之后進(jìn)行CSRF檢查。
這個(gè)中間件的工作原理如下:
當(dāng)請(qǐng)求到達(dá)時(shí),
CsrfViewMiddleware
將檢查請(qǐng)求方法是否為安全方法(GET、HEAD、OPTIONS、TRACE),如果是安全方法,則不會(huì)執(zhí)行CSRF檢查。如果請(qǐng)求方法不是安全方法,則中間件會(huì)檢查請(qǐng)求中是否包含CSRF令牌。令牌通常作為名為
csrftoken
的Cookie發(fā)送給客戶端,并作為名為csrfmiddlewaretoken
的POST參數(shù)或者HTTP頭部發(fā)送回服務(wù)器。
在的HTML表單中包含 {% csrf_token %}
模板標(biāo)簽,例如:
<form method="post">
{% csrf_token %}
<!-- 其他表單字段 -->
<button type="submit">提交</button>
</form>
在每個(gè)表單提交或者重要請(qǐng)求中,包含一個(gè)隨機(jī)生成的
CSRF Token
,并在后端驗(yàn)證該Token
的有效性。攻擊者很難偽造這個(gè)Token
,因?yàn)樗请S機(jī)的并且只在當(dāng)前會(huì)話有效。
如果請(qǐng)求中缺少CSRF令牌,或者CSRF令牌與cookie中的不匹配,Django將拋出 CSRFTokenMissing
或者CSRFTokenForbidden
異常,從而拒絕請(qǐng)求。
最后
本文簡(jiǎn)單介紹了下CSRF攻擊的攻擊過程和1個(gè)防范案例,其實(shí)還存在很多對(duì)CSRF的防范措施,對(duì)這方面的有興趣的小伙伴可以再深究學(xué)習(xí)下。
此外還希望小伙伴引以為戒,千萬不要亂點(diǎn)一些奇怪郵件里的鏈接?。。?!