什麼是CSRF?面試
CSRF(Cross-site request forgery)跨站請求僞造,也被稱爲「One Click Attack」或者Session Riding,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS很是不一樣,XSS利用站點內的信任用戶,而CSRF則經過假裝成受信任用戶的請求來利用受信任的網站。數據庫
CSRF攻擊的本質緣由:api
CSRF攻擊是源於Web的隱式身份驗證機制!Web的身份驗證機制大體就是說爲了防止用戶每次發送請求的時候都須要登陸,在進行一次登陸驗證經過後,以後發向該域名的請求都會自動帶上cookie。雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶批准發送的。CSRF攻擊的通常是由服務端解決,而XSS主要是由客戶端解決。跨域
CSRF攻擊的原理:瀏覽器
1. 用戶打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登陸網站A。安全
2.在用戶信息經過驗證後,網站A產生Cookie信息並返回給瀏覽器。服務器
3. 用戶在未退出網站A以前,在同一瀏覽器中,打開一個TAB頁訪問網站B。cookie
4. 網站B接收到用戶請求後,發出一個訪問網站A的請求。session
5. 瀏覽器根據網站B的請求,在用戶不知情的狀況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求實際上是由B發起的,因此會根據用戶的Cookie信息處理該請求,達到模擬用戶操做的目的。dom
tips:Session Cookie(在瀏覽器關閉後,就會失效,保存到內存)
Third-party Cookie(關閉瀏覽器後,不會失效,保存到本地)
常見的CSRF攻擊:
Get請求,操做數據庫內容
好比網站A的修改密碼接口是GET方式,經過調用api/ChangePassword?psw=123就能夠進行密碼的修改,因此在開發的過程當中若是涉及到數據改動都建議採用POST請求
隱藏表單提交POST請求
單純的POST固然也是能僞造的,JS利用form表單能夠跨域請求的特性的提交POST請求仍然可以產生CSRF攻擊。
若是網站A有使用Flash,並將跨域策略文件中的allow-access-from domain設置爲素有,也是有可能產生CSRF攻擊的。
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攻擊
1、Referer(記錄 HTTP 請求的來源地址) Check
好處是隻須要增長一個攔截器來檢查 Referer ,用於過濾非該服務器域名的地址,不須要改變當前系統的任何已有代碼和邏輯,很是快捷。
可是,Referer 的值是由瀏覽器提供的,雖然 HTTP 協議上有明確的要求,可是每一個瀏覽器對於 Referer 的具體實現可能有差異,並不能保證瀏覽器自身沒有安全漏洞。使用驗證 Referer 值的方法,就是把安全性都依賴於第三方(即瀏覽器)來保障,不是很靠譜,而且一些低版本的瀏覽器像IE6等有方法對Referer 進行篡改。還有重要的一點是,用戶能夠設置瀏覽器不攜帶 Referer字段。
2、驗證碼
強制用戶必須與應用進行交互,才能完成最終請求。在一般狀況下,驗證碼能很好遏制CSRF攻擊。可是出於用戶體驗考慮,網站不能給全部的操做都加上驗證碼。所以驗證碼只能做爲一種輔助手段,不能做爲主要解決方案。
3、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
4、HTTP 頭中自定義屬性並驗證
相似方法三,只不過不是以參數形式,而是請求頭字段攜帶Token信息。可是要把全部請求都改成 XMLHttpRequest 請求。
至此,有關XSS和CSRF的內容都講解完畢了,感謝你們抽空閱讀。