帶你了解CSRF和XSS(二)


什么是CSRF?

    CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝成受信任用戶的請求來利用受信任的網站。

 

CSRF攻擊的本質原因:

    CSRF攻擊是源於Web的隱式身份驗證機制!Web的身份驗證機制大致就是說為了防止用戶每次發送請求的時候都需要登錄,在進行一次登錄驗證通過后,之后發向該域名的請求都會自動帶上cookie。雖然可以保證一個請求是來自於某個用戶的瀏覽器,但卻無法保證該請求是用戶批准發送的。CSRF攻擊的一般是由服務端解決,而XSS主要是由客戶端解決。

    

CSRF攻擊的原理:

    1. 用戶打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A。

    2.在用戶信息通過驗證后,網站A產生Cookie信息並返回給瀏覽器。

    3. 用戶在未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B。

    4. 網站B接收到用戶請求后,發出一個訪問網站A的請求。

    5. 瀏覽器根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據用戶的Cookie信息處理該請求,達到模擬用戶操作的目的。

 

    tips:Session Cookie(在瀏覽器關閉后,就會失效,保存到內存)

           Third-party Cookie(關閉瀏覽器后,不會失效,保存到本地)

 

常見的CSRF攻擊:

  1. Get請求,操作數據庫內容
    比如網站A的修改密碼接口是GET方式,通過調用api/ChangePassword?psw=123就可以進行密碼的修改,所以在開發的過程中如果涉及到數據改動都建議采用POST請求

  2. 隱藏表單提交POST請求
    單純的POST當然也是能偽造的,JS利用form表單可以跨域請求的特性的提交POST請求仍然能夠產生CSRF攻擊。

  3. 如果網站A有使用Flash,並將跨域策略文件中的allow-access-from domain設置為素有,也是有可能產生CSRF攻擊的。

  4. XSRF
    通常來說CSRF是由XSS實現的,所以CSRF時常也被稱為XSRF,用XSS的方式實現偽造請求,比如網站A存在XSS漏洞,被注入惡意代碼后,當有用戶訪問到有惡意代碼的網頁的時候,就會發送一條類似轉賬,關注啊之類的請求,做到XSRF攻擊。

    

 

    看完這幾種攻擊方式,大概應該能辨別什么時候是CSRF攻擊了,簡單說就是只要發起了冒牌請求那么就算是CSRF(XSRF)

 

    順便再總結下XSS和CSRF的其他區別,面試官可能會問到哦~

    區別一,發生位置

        XSS:發生在客戶端

        CSRF:發生在服務端

    區別二,原理

        XSS:注入代碼,執行代碼,篡改內容

        CSRF:攜帶Cookie模擬請求

    區別三,根源

        XSS:同源策略機制

        CSRF:Web隱式身份驗證機制

    區別四,就Cookie而言

        XSS:盜取Cookie來干壞事

        CSRF:借用Cookie來干壞事

 

最后還是要說下如何防范CSRF攻擊

    一、Referer(記錄 HTTP 請求的來源地址) Check

         好處是只需要增加一個攔截器來檢查 Referer ,用於過濾非該服務器域名的地址,不需要改變當前系統的任何已有代碼和邏輯,非常快捷。

        但是,Referer 的值是由瀏覽器提供的,雖然 HTTP 協議上有明確的要求,但是每個瀏覽器對於 Referer 的具體實現可能有差別,並不能保證瀏覽器自身沒有安全漏洞。使用驗證 Referer 值的方法,就是把安全性都依賴於第三方(即瀏覽器)來保障,不是很靠譜,並且一些低版本的瀏覽器像IE6等有方法對Referer 進行篡改。還有重要的一點是,用戶可以設置瀏覽器不攜帶 Referer字段。

 

    二、驗證碼

        強制用戶必須與應用進行交互,才能完成最終請求。在通常情況下,驗證碼能很好遏制CSRF攻擊。但是出於用戶體驗考慮,網站不能給所有的操作都加上驗證碼。因此驗證碼只能作為一種輔助手段,不能作為主要解決方案。

 

    三、Token

        在 HTTP 請求中以參數的形式添加一個隨機產生的 token,並在服務器端建立一個攔截器來驗證這個 token,假設請求中沒有 token 或者 token 內容不對,則覺得可能是 CSRF 攻擊而拒絕該請求。並且涉及數據庫操作的接口使用POST,因為GET不好加Token,會暴露Token的保密性。

    關於Token

  • Token 應該保存到 local / session stograge(不會跨域工作) 或者 cookies

  • Tokens 除了像 cookie 一樣有有效期,還要提供過期重新獲取、強制刷新、撤回等操作

  • 有需要的話,要加密並且簽名 token

  • 將 JSON Web Tokens(JWT) 應用到 OAuth 2

 

    四、HTTP 頭中自定義屬性並驗證

        類似方法三,只不過不是以參數形式,而是請求頭字段攜帶Token信息。但是要把所有請求都改為 XMLHttpRequest 請求。

 

    至此,有關XSS和CSRF的內容都講解完畢了,感謝大家抽空閱讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM