這裏主要記錄在平常中對知識的學習,經過結合筆記與自身理解的方式嘗試寫下總結
文章對細節可能不會一一介紹解釋,內容僅做參考
複製代碼
今天來寫學習CSRF的總結~javascript
CSRF是一種挾持用戶在當前已登陸的Web應用程序上執行非本意的操做的一種攻擊方式html
跨域指的是請求來源於其餘網站java
僞造指的是非用戶自身的意願web
簡單的說,跨站請求僞造攻擊是攻擊者經過手段欺騙用戶的瀏覽器去訪問用戶曾經認證過的網站並執行一些操做(如發送郵件、發消息、甚至財產操做如轉帳和購買商品等)。因爲瀏覽器曾經認證過,因此被訪問的網站會認爲是真正的用戶操做而去執行。這利用了web登陸身份認證的一個漏洞:簡單的身份認證只能保證請求來自用戶的瀏覽器,但不能識別請求是用戶自願發出的跨域
原理:用戶在目標網站進行過登陸並拿到確認後的憑證(如cookie),攻擊網站經過攜帶身份憑證進行對目標網站後臺發送請求瀏覽器
假設有這樣一個場景:目標網站A(www.a.com),惡意網站B(www.b.com)服務器
兩個網站的域名不同,目標網站A上有一個刪除文章的功能,一般是用戶單擊'刪除文章'連接時纔會刪除指定的文章。這個連接是www.a.com/blog/del?id=1, id表明不一樣的文章。實際上就是發起一個GET請求cookie
若是在目標網站A上存在XSS漏洞,那麼能夠利用這個XSS漏洞來進行攻擊:app
若是在目標網站A上不存在XSS漏洞,那麼能夠利用GET CSRF進行攻擊:學習
對比CSRF和XSS攻擊能夠看出,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的某篇文章的標題了
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的值爲空或者錯誤,拒絕這個可疑請求