簡介
Cross-site request forgery(跨站請求偽造)
wikipedia:
是一種挾制用戶在當前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法
過程
- 用戶登陸一個網(wǎng)站a野舶,本地生成cookie
-
在未退出a的情況下,訪問b網(wǎng)站。
CSRF攻擊流程
HTTP Cookie:
當服務(wù)器收到HTTP請求時刹缝,可以在響應(yīng)頭中增加一個Set-Cookie頭部。瀏覽器收到響應(yīng)后通常會保存Cookie横殴,之后對該服務(wù)器每一次請求中都通過Cookie請求頭部將Cookie信息發(fā)送給服務(wù)器萝快。
會話狀態(tài)管理(如用戶登錄狀態(tài)、購物車蚜厉、游戲分數(shù)和其它需要記錄的信息)
個性化設(shè)置(如用戶自定義設(shè)置、主題等)
瀏覽器行為跟蹤(如跟蹤分析用戶行為)
例子
假如一家銀行用以執(zhí)行轉(zhuǎn)賬操作的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字段應(yīng)和請求的地址位于同一域名下。以上文銀行操作為例脊另,Referer字段地址通常應(yīng)該是轉(zhuǎn)賬按鈕所在的網(wǎng)頁地址导狡,應(yīng)該也位于www.examplebank.com之下。而如果是CSRF攻擊傳來的請求偎痛,Referer字段會是包含惡意網(wǎng)址的地址旱捧,不會位于www.examplebank.com之下,這時候服務(wù)器就能識別出惡意的訪問踩麦。 - 在請求地址中添加 token 并驗證.
- 服務(wù)端在收到路由請求時枚赡,生成一個隨機數(shù),在渲染請求頁面時把隨機數(shù)埋入頁面(form表單中 <input type="hidden" name="_csrf_token" value="xxx" )
- 服務(wù)端設(shè)置setCookie靖榕,把該隨機數(shù)作為cookie或者session返回用戶瀏覽器
- 當用戶發(fā)送 GET 或者 POST 請求時帶上參數(shù)
- 后臺在接受到請求后解析請求的cookie獲取參數(shù)的值标锄,然后和用戶請求提交的_csrf_token做個比較,如果相等表示請求合法茁计。