1. CSRF攻擊原理
CSRF(Cross site request forgery),即跨站請求偽造。我們知道XSS是跨站腳本攻擊,就是在用戶的瀏覽器中執行攻擊者的腳本,來獲得其cookie等信息。而CSRF確實,借用用戶的身份,向web server發送請求,因為該請求不是用戶本意,所以稱為“跨站請求偽造”。
一般而且存在XSS漏洞的網站,也極有可能存在CSRF漏洞。因為CSRF攻擊中的那個“偽造的請求”的URL地址,一般是通過XSS攻擊來注入到服務器中的。所以其實CSRF是以XSS為基礎的,也可以看做是XSS攻擊的一種。
CSRF一般的攻擊過程是,攻擊者向目標網站注入一個惡意的CSRF攻擊URL地址(跨站url),當(登錄)用戶訪問某特定網頁時,如果用戶點擊了該URL,那么攻擊就觸發了,我們可以在該惡意的url對應的網頁中,利用 <img src="" /> 來向目標網站發生一個get請求,該請求會攜帶cookie信息,所以也就借用了用戶的身份,也就是偽造了一個請求,該請求可以是目標網站中的用戶有權限訪問的任意請求。也可以使用javascript構造一個提交表單的post請求。比如構造一個轉賬的post請求。
所以CSRF的攻擊分為了兩步,首先要注入惡意URL地址,然后在該地址中寫入攻擊代碼,利用<img> 等標簽或者使用Javascript腳本。
2. CSRF防御
2.1 referer
因為偽造的請求一般是從第三方網站發起的,所以第一個防御方法就是判斷 referer 頭,如果不是來自本網站的請求,就判定為CSRF攻擊。但是該方法只能防御跨站的csrf攻擊,不能防御同站的csrf攻擊(雖然同站的csrf更難)。
2.2 使用驗證碼
每一個重要的post提交頁面,使用一個驗證碼,因為第三方網站是無法獲得驗證碼的。還有使用手機驗證碼,比如轉賬是使用的手機驗證碼。
2.3 使用token
每一個網頁包含一個web server產生的token, 提交時,也將該token提交到服務器,服務器進行判斷,如果token不對,就判定位CSRF攻擊。
將敏感操作又get改為post,然后在表單中使用token. 盡量使用post也有利於防御CSRF攻擊。
3. 有價值的參考
http://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
http://drops.wooyun.org/papers/155
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html#!comments
https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project
http://www.hanguofeng.com/archives/security/preventing-csrf
4. 使用 OWASP CSRFGuard 防御 CSRF
https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project
https://www.owasp.org/index.php/CSRFGuard_3_User_Manual
http://blog.csdn.net/testing_is_believing/article/details/11672553