前端安全總結之CSRF

這裏主要記錄在平常中對知識的學習,經過結合筆記與自身理解的方式嘗試寫下總結
文章對細節可能不會一一介紹解釋,內容僅做參考
複製代碼

今天來寫學習CSRF的總結~javascript

1、 CSRF(跨站請求僞造)

CSRF是一種挾持用戶在當前已登陸的Web應用程序上執行非本意的操做的一種攻擊方式html

跨域指的是請求來源於其餘網站java

僞造指的是非用戶自身的意願web

簡單的說,跨站請求僞造攻擊是攻擊者經過手段欺騙用戶的瀏覽器去訪問用戶曾經認證過的網站並執行一些操做(如發送郵件、發消息、甚至財產操做如轉帳和購買商品等)。因爲瀏覽器曾經認證過,因此被訪問的網站會認爲是真正的用戶操做而去執行。這利用了web登陸身份認證的一個漏洞:簡單的身份認證只能保證請求來自用戶的瀏覽器,但不能識別請求是用戶自願發出的跨域

原理:用戶在目標網站進行過登陸並拿到確認後的憑證(如cookie),攻擊網站經過攜帶身份憑證進行對目標網站後臺發送請求瀏覽器

2、 GET CSRF

假設有這樣一個場景:目標網站A(www.a.com),惡意網站B(www.b.com)服務器

兩個網站的域名不同,目標網站A上有一個刪除文章的功能,一般是用戶單擊'刪除文章'連接時纔會刪除指定的文章。這個連接是www.a.com/blog/del?id=1, id表明不一樣的文章。實際上就是發起一個GET請求cookie

若是在目標網站A上存在XSS漏洞,那麼能夠利用這個XSS漏洞來進行攻擊:app

  1. 使用Ajax發起一個GET請求,由於是在目標網站上,因此符合同源策略。請求參數爲id=1, 請求目標地址爲www.a.com/blog/del
  2. 或者在目標網站A上動態建立一個標籤(script, img, iframe等),將其src指向www.a.com/blog/del?id=1, 那麼攻擊就會發起。實際上經過這種方式發起的請求就是一個GET請求
  3. 最後欺騙用戶登陸目標網站A,那麼攻擊就會發生

若是在目標網站A上不存在XSS漏洞,那麼能夠利用GET CSRF進行攻擊:學習

  1. 沒法使用Ajax發起GET請求。由於CSRF請求是跨域的,而Ajax有同源策略的限制
  2. 能夠經過在惡意網站B上靜態或者動態建立img,script等標籤發起GET請求。將其src屬性指向www.a.com/blog/del?id=1。經過標籤的方式發起的請求不受同源策略的限制(開放策略)
  3. 最後欺騙已經登陸目標網站A的用戶訪問惡意網站B,那麼就會攜帶網站A源的登陸憑證向網站A後臺發起請求,這樣攻擊就發生了

對比CSRF和XSS攻擊能夠看出,CSRF攻擊有如下幾個關鍵點:

  • 請求是跨域的,能夠看出請求是從惡意網站B上發出的
  • 經過img, script等標籤來發起一個GET請求,由於這些標籤不受同源策略的限制
  • 發出的請求是身份認證後的

3、POST CSRF

假如目標網站A上有發表文章的功能,那麼咱們就能夠動態建立form標籤,而後修改文章的題目。

在網站B中:

function setForm () {
    var form = document.createElement('form')
    form.action = 'www.a.com/blog/article/update'
    form.methods = 'POST'
    var input = document.createElement('input')
    input.type = 'text'
    input.value = 'csfr攻擊啦!'
    input.id = 'title'
    form.appendChild(input)
    document.body.appendChild(form)
    form.submit()
}
setForm()
複製代碼

上面代碼能夠看出,動態建立了form表單,而後調用submit方法,就能夠經過跨域的僞造請求來實現修改目標網站A的某篇文章的標題了

4、CSRF的危害

CSRF的危害:

  • 利用用戶登陸態
  • 用戶不知情
  • 盜取用戶資金
  • 冒充用戶完成操做或修改數據

5、CSRF的防範

  • 禁止第三方網站帶Cookies

    設置Cookies中的same-site屬性,使之只能在同網站下使用

  • 檢測請求頭中的Referer字段

    從目標網站A和惡意網站B發出的請求中,請求頭惟一的不一樣就是Referer字段

    以上面刪除文章功能爲例,在目標網站A中的Referer字段爲http://www.a.com/blog/,而惡意網站B中的Referer字段爲http://www.b.com/csrf.html。根據Referer字段與Host字段在同一域名下的規則,能夠檢測Referer字段值,若是發現其與Host值不在同一域名下,這時候服務器就可以識別出惡意的訪問了

  • 添加檢驗token

    因爲CSRF的本質在於攻擊者欺騙用戶去訪問本身設置的地址,因此若是要求在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在cookie中,而且攻擊者沒法僞造的數據做爲校驗,那麼攻擊者就沒法再執行CSRF攻擊。這種數據一般是表單中的一個數據項。服務器將其生成並附加在表單中,其內容是一個隨機數。即的形式

    當客戶端經過表單提交請求時,這個隨機數也一併提交上去以供校驗。正常的訪問時,客戶端瀏覽器可以正確獲得並傳回這個隨機數,而經過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個隨機數的值,服務器端就會由於校驗token的值爲空或者錯誤,拒絕這個可疑請求

相關文章
相關標籤/搜索