第四章 跨站點請求偽造(CSRF)
1. 什么是CSRF碧查?
全名:Cross Site Request Forgery, 中文名:跨站點請求偽造校仑。
2. CSRF可以做什么忠售?
攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求迄沫。
3. GET類型的CSRF
只需要一個HTTP請求稻扬,就可以構(gòu)造一次簡單的CSRF。
示例:
銀行網(wǎng)站A羊瘩,它以GET請求來完成銀行轉(zhuǎn)賬的操作泰佳,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危險網(wǎng)站B,它里面有一段HTML的代碼如下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先尘吗,你登錄了銀行網(wǎng)站A逝她,然后訪問危險網(wǎng)站B,噢睬捶,這時你會發(fā)現(xiàn)你的銀行賬戶少了1000塊......
為什么會這樣呢汽绢?原因是銀行網(wǎng)站A違反了HTTP規(guī)范,使用GET請求更新資源侧戴。在訪問危險網(wǎng)站B的之前宁昭,你已經(jīng)登錄了銀行網(wǎng)站A,而B中的<img>
以GET的方式請求第三方資源(這里的第三方就是指銀行網(wǎng)站了酗宋,原本這是一個合法的請求积仗,但這里被不法分子利用了),所以你的瀏覽器會帶上你的銀行網(wǎng)站A的Cookie發(fā)出Get請求蜕猫,去獲取資源http://www.mybank.com/Transfer.php?toBankId=11&money=1000 寂曹,結(jié)果銀行網(wǎng)站服務(wù)器收到請求后,認(rèn)為這是一個更新資源操作(轉(zhuǎn)賬操作),所以就立刻進行轉(zhuǎn)賬操作......
4. POST類型的CSRF
攻擊者可以使用JavaScript構(gòu)造表單隆圆。
栗子略漱挚。
5. 如何防御CSRF
-
驗證碼
- 在表單中增加一個隨機的數(shù)字或字母驗證碼,通過強制用戶和應(yīng)用進行交互渺氧,來有效地遏制CSRF攻擊旨涝。
-
Referer Check
- 檢查如果是非正常頁面過來的請求,則極有可能是CSRF攻擊侣背。
-
Anti CSRF TOKEN
- 在請求的參數(shù)里增加一個隨機的參數(shù)token白华,token只能服務(wù)器和客戶端知道,不能有第三方知道贩耐。
- token需要足夠隨機
- 敏感的操作應(yīng)該使用POST弧腥,而不是GET,以form表單的形式提交潮太,可以避免token泄露管搪。