CSRF Token介紹與應對策略

2021-09-05 10:59:12 字數 3183 閱讀 1304

csrf(cross site request forgery, 跨站域請求偽造)是一種網路的攻擊方式,它在 2007 年曾被列為網際網路 20 大安全隱患之一。其他安全隱患,比如 sql 指令碼注入,跨站域指令碼攻擊等在近年來已經逐漸為眾人熟知,很多**也都針對他們進行了防禦。然而,對於大多數人來說,csrf 卻依然是乙個陌生的概念。即便是大名鼎鼎的 gmail, 在 2007 年底也存在著 csrf 漏洞,從而被黑客攻擊而使 gmail 的使用者造成巨大的損失。

csrf 攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求傳送給受攻擊站點,從而在並未授權的情況下執行在許可權保護之下的操作。比如說,受害者 bob 在銀行有一筆存款,通過對銀行的**傳送請求 可以使 bob 把 1000000 的存款轉到 bob2 的賬號下。通常情況下,該請求傳送到**後,伺服器會先驗證該請求是否來自乙個合法的 session,並且該 session 的使用者 bob 已經成功登陸。黑客 mallory 自己在該銀行也有賬戶,他知道上文中的 url 可以把錢進行轉帳操作。mallory 可以自己傳送乙個請求給銀行:但是這個請求來自 mallory 而非 bob,他不能通過安全認證,因此該請求不會起作用。這時,mallory 想到使用 csrf 的攻擊方式,他先自己做乙個**,在**中放入如下**: src=」 」,並且通過廣告等誘使 bob 來訪問他的**。當 bob 訪問該**時,上述 url 就會從 bob 的瀏覽器發向銀行,而這個請求會附帶 bob 瀏覽器中的 cookie 一起發向銀行伺服器。大多數情況下,該請求會失敗,因為他要求 bob 的認證資訊。但是,如果 bob 當時恰巧剛訪問他的銀行後不久,他的瀏覽器與銀行**之間的 session 尚未過期,瀏覽器的 cookie 之中含有 bob 的認證資訊。這時,悲劇發生了,這個 url 請求就會得到響應,錢將從 bob 的賬號轉移到 mallory 的賬號,而 bob 當時毫不知情。等以後 bob 發現賬戶錢少了,即使他去銀行查詢日誌,他也只能發現確實有乙個來自於他本人的合法請求轉移了資金,沒有任何被攻擊的痕跡。而 mallory 則可以拿到錢後逍遙法外。

在討論如何抵禦 csrf 之前,先要明確 csrf 攻擊的物件,也就是要保護的物件。從以上的例子可知,csrf 攻擊是黑客借助受害者的 cookie 騙取伺服器的信任,但是黑客並不能拿到 cookie,也看不到 cookie 的內容。另外,對於伺服器返回的結果,由於瀏覽器同源策略的限制,黑客也無法進行解析。因此,黑客無法從返回的結果中得到任何東西,他所能做的就是給伺服器傳送請求,以執行請求中所描述的命令,在伺服器端直接改變資料的值,而非竊取伺服器中的資料。所以,我們要保護的物件是那些可以直接產生資料改變的服務,而對於讀取資料的服務,則不需要進行 csrf 的保護。比如銀行系統中轉賬的請求會直接改變賬戶的金額,會遭到 csrf 攻擊,需要保護。而查詢餘額是對金額的讀取操作,不會改變資料,csrf 攻擊無法解析伺服器返回的結果,無需保護。

看了很多篇關於token的文章,這個算是最通俗易懂的文章之一了。

csrf攻擊屬於一種惡意**的攻擊,惡意**會通過你電腦,尚未過期的session登陸狀態,來傳送一些請求,達到某種目的。

防止的方法:

但是這種辦法黑客可以通過修改referer來實現,並且也屬於第三方的,通過瀏覽器來實現安全。對於程式設計師來說,不可定性還是很高。

2.可以通過設定一定個token,在登陸的時候,自動生成乙個token,在表單提交或者請求連線的時候,都加上token值。這個樣子的話,如果是csrf攻擊的話,那麼就不存在token值或錯誤的token值。就會的導致token不一致,無法過***。

現在做的專案就是在登陸的時候自動生成乙個token值,存入到mysql資料庫,當請求的時候,就會去資料庫匹配token。至於為什麼使用mysql裡儲存token,不用session儲存。這個我就不知道了,可能是手機端吧。

3.可以在自定義屬性xmlhttprequest中,新增乙個token,這個token不是以引數的形式傳遞的,而是放到http頭中自定義的屬性裡,通過xmlhttprequest給所有求情加上token。

但是xmlhttprequest是大多數用於ajax請求,侷限性比較大,不是所有的類都是由這個類來發起的。對於一些遺留性**,如果要使用這種方式,需要重寫整個程式,這個代價是非常大的。並且通過該類訪問的位址,在瀏覽器上不會有記錄,所以使用者在前進,後退,重新整理,收藏等操作,不容易實現。造成一定困難。

csrf 防禦方法選擇之道

通過上文討論可知,目前業界應對 csrf 攻擊有一些克制方法,但是每種方法都有利弊,沒有一種方法是完美的。如何選擇合適的方法非常重要。如果**是乙個現有系統,想要在最短時間內獲得一定程度的 csrf 的保護,那麼驗證 referer 的方法是最方便的,要想增加安全性的話,可以選擇不支援低版本瀏覽器,畢竟就目前來說,ie7+, ff3+ 這類高版本瀏覽器的 referer 值還無法被篡改。

如果系統必須支援 ie6,並且仍然需要高安全性。那麼就要使用 token 來進行驗證,在大部分情況下,使用 xmlhttprequest 並不合適,token 只能以引數的形式放於請求之中,若你的系統不支援使用者自己發布資訊,那這種程度的防護已經足夠,否則的話,你仍然難以防範 token 被黑客竊取並發動攻擊。在這種情況下,你需要小心規劃你**提供的各種服務,從中間找出那些允許使用者自己發布資訊的部分,把它們與其他服務分開,使用不同的 token 進行保護,這樣可以有效抵禦黑客對於你關鍵服務的攻擊,把危害降到最低。畢竟,刪除別人乙個帖子比直接從別人賬號中轉走大筆存款嚴重程度要輕的多。

如果是開發乙個全新的系統,則抵禦 csrf 的選擇要大得多。筆者建議對於重要的服務,可以盡量使用 xmlhttprequest 來訪問,這樣增加 token 要容易很多。另外盡量避免在 js **中使用複雜邏輯來構造常規的同步請求來訪問需要 csrf 保護的資源,比如 window.location 和 document.createelement(「a」) 之類,這樣也可以減少在附加 token 時產生的不必要的麻煩。

最後,要記住 csrf 不是黑客唯一的攻擊手段,無論你 csrf 防範有多麼嚴密,如果你系統有其他安全漏洞,比如跨站域指令碼攻擊 xss,那麼黑客就可以繞過你的安全防護,展開包括 csrf 在內的各種攻擊,你的防線將如同虛設。

總結與展望

可見,csrf 是一種危害非常大的攻擊,又很難以防範。目前幾種防禦策略雖然可以很大程度上抵禦 csrf 的攻擊,但並沒有一種完美的解決方案。一些新的方案正在研究之中,比如對於每次請求都使用不同的動態口令,把 referer 和 token 方案結合起來,甚至嘗試修改 http 規範,但是這些新的方案尚不成熟,要正式投入使用並被業界廣為接受還需時日。在這之前,我們只有充分重視 csrf,根據系統的實際情況選擇最合適的策略,這樣才能把 csrf 的危害降到最低。

風險應對策略

應急計畫 接受專案風險的一種做法,事先計畫好當接受的風險發生時,應該採取的具體步驟。需要建立一定的應急儲備,用於應對已知風險和已知 未知型風險。應急計畫中同時規定風險觸發因素,即出現何種徵兆時執行應急計畫。彈回計畫 備用應對計畫,在主應對計畫不起作用的情況下使用。權變措施 針對已發生的風險而緊急採取...

常用風險和相應對策

10種常用風險和相應對策序號 軟體風險 相應對策 1 人員不足 1 錄用優秀人才。2 人員應適用崗位工作。3 全面考慮團隊建設。4 實施培訓。5 預先安排關鍵人員的使用計畫。2 進度計畫和預算不准 1 詳細評估多種資源成本和進度。2 依成本進行設計。3 採用漸增是開發。4 軟體復用。5 純淨需求。3...

危機下的應對策略

金融危機下!創業好機會!好的專案很重要!教育一 我們在招 商 合作後我們會提供乙個學習網給你 像這種 www.sosocg.com 上面包括 從小孩到六十歲老人的學習課程,內容很豐富,市場前景也很好!我們管 推廣,如果有人來 上學 習,合作者就可以收費了,學習的前擔是要有學習卡,學習卡是在我們公司拿...