OWASP Top 10(2013) 第六篇 之 A8
A8 – 跨站點請求偽造
跨站點請求偽造是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法,簡單說就是使用者在瀏覽網站1.com的時候,裡面含有一些惡意內容,在使用者不知情的情況下訪問了網站2.com,從而不知不覺的進行了一些惡意操作。
在網上找了張圖片很能說明這個過程:
首先,使用者正常訪問某一伺服器的網站,成功登陸系統,生成了會話cookie,並保持會話在有效狀態;然後到了第4步的時候,使用者通過郵件或者IM等方式,收到了具有惡意程式碼的攻擊網址,當用戶點選此攻擊頁面時,攻擊者通過利用 html標籤img,script,iframe等元素的src屬性,使使用者在不知情的情況下,發起對正常site的惡意訪問,當點選完成後,也就是在圖中第5步時,惡意程式碼已經執行完畢,攻擊就發生且完成。
上面說過了攻擊原理之後,我們來說說如何防止這種不知情情況下就發生的攻擊呢?一般有如下幾種方式:
1、使用cookie的httponly屬性,httponly屬性可以阻止客戶端JavaScript指令碼來讀取使用者的cookie資訊,從而保證資料的安全性。
2、檢查請求的Referer,Referer Check用來檢驗請求是否來自合法的源頭,因為在網際網路Web應用中,頁面與頁面之間都有一定的邏輯關係,使得每個正常請求都有一定的規律,一般是可以 通過HTTP請求的頭部獲取Referer資訊,通過判斷該值是可以識別出來有可能是CSRF請求。但是這樣會使得編碼相對複雜一些,同時,服務一併不一 定可以獲取其值,有些使用者或瀏覽器處於隱私保護或安全的目的,會禁用Referer資訊得傳送,所以這種方法是一種可行的方法,但並不是一種可以依賴的防 御CSRF的手段。
3、採用驗證碼,這是一種最簡單而有效的防止CSRF的方法,因為驗證碼在請求完成的過程中,強制使用者與應用進行了互動,而CSRF都是在使用者不知情的情 況下完成的,所以很有效。但是驗證碼需要每個提交都要使用者輸入,增加了使用者操作的複雜度,使用者體驗不好,一般只在登陸的時候使用比較好,所以這種方法只能 作為一種輔助手段,而不是主要手段。
4、使用Token,這是防止CSRF最有效也是最常用的方法,具體就是在使用者登陸成功後,為該會話分配一個採用安全隨機數(不可被預測)生成的值,儲存 在session裡面,稱之為token。同時,在客戶端的Web頁面通過hidden元素將值寫入裡面。當客戶端提交請求的時候,將此token隨請求 一起提交,伺服器端可以通過此提交的token來和session裡存放的token來對比,通過對比結果來判斷客戶端的訪問是否合法。這種方法也是當前 最廣泛的方法。
5、儘量使用POST,放棄GET方法,CSRF攻擊多數攻擊程式碼都被隱藏在iframe,img等元素的src屬性裡,這樣瀏覽器進行載入的時候,只會發起get操作,所以,如果我們的伺服器端都改為POST的話,至少會降低被攻擊的概率。
6、增加二次確認頁面,在進行刪除,更新的時候,不要直接進行資料操作,而是加入一些確認對話方塊之類的頁面,讓使用者二次確認,即增加使用者與服務端的互動行為。
關於這部分就說這麼多吧~