安全對於互聯網的從業技術人員來說,一直是接觸或者實際使用掌握比較薄弱的一塊,固然對於那些專項搞安全類的技術人員來說除外。 接下來就來聊聊在互聯網領域中經常使用的一些安全漏洞類型和一些防範手段,固然針對安全這塊,可能我會選擇做爲一個系列議題進行分享,而本文先聊聊安全類型中常見的CSRF, 本文重點圍繞CSRF理論方面的知識進行論述,下一章節會結合自身的平臺項目分享一下安全的一些實踐經驗。javascript
首先在介紹CSRF以前,咱們先了解清楚,何爲CSRF? CSRF全稱爲(Cross-site request forgery),中文名稱:跨站請求僞造,經常使用縮寫爲CSRF或者有些地方也稱之爲XSRF。html
那麼它能作什麼呢,對你們平常使用倒底有哪些危害的? 你這能夠這麼理解CSRF攻擊:攻擊者利用CSRF盜用了你的身份,以你的名義發送惡意請求,對服務器來講這個請求是徹底合法的, 它的常見攻擊行爲如以你名義發送郵件,發消息,盜取你的帳號,從而形成你的我的隱私泄露甚至財產安全。java
知道了CSRF是什麼,那麼下面來聊聊,它是的攻擊原理是怎樣的:python
看到這裏,有經驗的人,會立刻總結出,發生CSRF攻擊,至少須要知足兩個條件:程序員
1.登陸受信任網站A,並在本地生成Cookie。瀏覽器
2.在不登出A的狀況下,訪問危險網站B。安全
那你可能會問,是否是我只要不知足其中一項,就能夠避免CSRF攻擊了,常規來講,確實如此,但你不能保證如下狀況不會發生:服務器
1.你不能保證你登陸了一個網站後,再也不打開一個tab頁面並訪問另外的網站。cookie
2.你不能保證你關閉瀏覽器了後,你本地的Cookie馬上過時,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認爲關閉瀏覽器就等於退出登陸/結束會話了)session
在大致瞭解了CSRF攻擊原理以後,咱們來總結一下,CSRF的攻擊對象是什麼,只有明確了它的攻擊對象,那麼咱們在接下來才知道如何去防護它。
從上面的原理中,咱們大概能明白了,CSRF 攻擊是攻擊者藉助受害者的 cookie 騙取服務器的信任,可是攻擊者並不能拿到 cookie,也看不到 cookie 的內容。 另外,對於服務器返回的結果,因爲瀏覽器同源策略的限制,攻擊者也沒法進行解析。所以,攻擊者沒法從返回的結果中獲得任何東西,他所能作的就是給服務 器發送請求,以執行請求中所描述的命令, 在服務器端直接改變數據的值,而非竊取服務器中的數據。因此,咱們要保護的對象是那些能夠直接產生數據改變的服務,而對於讀取數據的服務,則不須要進行 CSRF 的保護。 好比銀行系統中轉帳的請求會直接改變帳戶的金額,會遭到 CSRF 攻擊,須要保護。而查詢餘額是對金額的讀取操做,不會改變數據,CSRF 攻擊沒法解析服務器返回的結果,無需保護。
根據 HTTP 協議,在 HTTP 頭中有一個字段叫 Referer,它記錄了該 HTTP 請求的來源地址。 在一般狀況下,訪問一個安全受限頁面的請求來自於同一個網站,好比須要訪問 http://bank.example/withdraw?account=test&amount=1000000&for=mikezhou, 用戶必須先登錄 bank.example,而後經過點擊頁面上的按鈕來觸發轉帳事件。這時,該轉賬請求的 Referer 值就會是轉帳按鈕所在的頁面的 URL, 一般是以 bank.example 域名開頭的地址。而若是攻擊者要對銀行網站實施 CSRF 攻擊,他只能在他本身的網站構造請求,當用戶通攻擊者的網站發送請求到銀行時, 該請求的 Referer 是指向攻擊者本身的網站。所以,要防護 CSRF 攻擊,銀行網站只須要對於每個轉帳請求驗證其 Referer 值,若是是以 bank.example 開頭的域名 ,則說明該請求是來自銀行網站本身的請求,是合法的。若是 Referer 是其餘網站的話,則有可能攻擊者的 CSRF 攻擊,拒絕該請求。
CSRF 攻擊之因此可以成功,是由於黑客能夠徹底僞造用戶的請求,該請求中全部的用戶驗證信息都是存在於 cookie 中, 所以黑客能夠在不知道這些驗證信息的狀況下直接利用用戶本身的 cookie 來經過安全驗證。 要抵禦 CSRF,關鍵在於在請求中放入黑客所不能僞造的信息,而且該信息不存在於 cookie 之中。 能夠在 HTTP 請求中以參數的形式加入一個隨機產生的 token,並在服務器端創建一個攔截器來驗證這個 token, 若是請求中沒有 token 或者 token 內容不正確,則認爲多是 CSRF 攻擊而拒絕該請求。
這種方法也是使用 token 並進行驗證,和上一種方法不一樣的是,這裏並非把 token 以參數的形式置於 HTTP 請求之中, 而是把它放到 HTTP 頭中自定義的屬性裏。經過 XMLHttpRequest 這個類,能夠一次性給全部該類請求加上 csrftoken 這個 HTTP 頭屬性, 並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,經過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的地址欄, 也不用擔憂 token 會透過 Referer 泄露到其餘網站中去。
使用loadrunner(或者http發包模擬器),發送兩次徹底相同的請求,檢查服務端返回的應答是否徹底同樣,若是徹底同樣,則代表存在漏洞。
使用loadrunner(或者http發包模擬器),發送http請求,分別設置http頭的refer字段爲空和其餘網站地址,檢查服務端是否返回了錯誤應答,若是是正確應答,則代表存在漏洞
從上面的章節內容中,咱們知道了什麼是CSRF,以及它的攻擊原理和一些經常使用的防護方法,那麼下章節將結合一些實際例子介紹一下如何攻防。 在結束以前,小結一下上面的內容:
CSRF產生流程:
攻擊者發現CSRF漏洞——構造代碼——發送給受害人——受害人打開——受害人執行代碼——完成攻擊
CSRF經常使用防護方法
一、經過 referer、token 或者 驗證碼 來檢測用戶提交。 二、儘可能不要在頁面的連接中暴露用戶隱私信息。 三、對於用戶修改刪除等操做最好都使用post 操做 。 四、避免全站通用的cookie,嚴格設置cookie的域
歡迎關注技術公衆號: