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