簡介
Cross-site request forgery(跨站請求偽造)
wikipedia:
是一種挾制用戶在當前已登錄的Web應用程序上執(zhí)行非本意的操作的攻擊方法
過程
- 用戶登陸一個網(wǎng)站a,本地生成cookie
-
在未退出a的情況下,訪問b網(wǎng)站。
CSRF攻擊流程
HTTP Cookie:
當服務器收到HTTP請求時,可以在響應頭中增加一個Set-Cookie頭部。瀏覽器收到響應后通常會保存Cookie,之后對該服務器每一次請求中都通過Cookie請求頭部將Cookie信息發(fā)送給服務器。
會話狀態(tài)管理(如用戶登錄狀態(tài)、購物車、游戲分數(shù)和其它需要記錄的信息)
個性化設置(如用戶自定義設置、主題等)
瀏覽器行為跟蹤(如跟蹤分析用戶行為)
例子
假如一家銀行用以執(zhí)行轉賬操作的URL地址如下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一個惡意攻擊者可以在另一個網(wǎng)站上放置如下代碼: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
如果有賬戶名為Alice的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那么她就會損失1000資金。
防范
- 檢查Referer字段
HTTP頭中有一個Referer字段,這個字段用以標明請求來源于哪個地址。在處理敏感數(shù)據(jù)請求時,通常來說,Referer字段應和請求的地址位于同一域名下。以上文銀行操作為例,Referer字段地址通常應該是轉賬按鈕所在的網(wǎng)頁地址,應該也位于www.examplebank.com之下。而如果是CSRF攻擊傳來的請求,Referer字段會是包含惡意網(wǎng)址的地址,不會位于www.examplebank.com之下,這時候服務器就能識別出惡意的訪問。 - 在請求地址中添加 token 并驗證.
- 服務端在收到路由請求時,生成一個隨機數(shù),在渲染請求頁面時把隨機數(shù)埋入頁面(form表單中 <input type="hidden" name="_csrf_token" value="xxx" )
- 服務端設置setCookie,把該隨機數(shù)作為cookie或者session返回用戶瀏覽器
- 當用戶發(fā)送 GET 或者 POST 請求時帶上參數(shù)
- 后臺在接受到請求后解析請求的cookie獲取參數(shù)的值,然后和用戶請求提交的_csrf_token做個比較,如果相等表示請求合法。
