CSRF 的攻擊過程

登錄態 Cookie 的 Key 是瀏覽器默認自動攜帶的,Key 通常是會話 Cookie,只要瀏覽器不關閉,Key 一直存在。所以只要用戶 A 曾經登錄過相冊網站 (這裏用 http://www.photo.com 舉例),瀏覽器沒有關閉,用戶在沒有關閉的瀏覽器打開一個黑客網頁 (這裏用 http://www.hacker.com),黑客頁面發送 HTTP 請求到 http://www.photo.com 的後臺會默認帶上 http://www.photo.com 的登錄態 Cookie,也就能模擬用戶 A 做一些增刪改等敏感操作。Get 和 Post 都一樣,這就是 CSRF 攻擊原理。這種攻擊過程也是最常見的攻擊過程。

上面說的增刪改都是寫操作,會對後臺數據產生負面影響,所以是能被攻擊的。另外一種讀操作,是具有冪等性,不會對後臺數據殘生負面影響,能否被攻擊到?讀操作也可能是敏感數據,舉個例子,比如 www.photo.com 上的私密相冊數據能否被 www.hacker.com 頁面拿到?這就涉及到前端跨域知識點了,默認大部分情況是拿不到,這裏列舉兩種特殊情是可以拿到的:

如果後臺返回的數據是 JSONP 格式的,這種只能是 Get 操作,是能被黑客頁面拿到的。

如果後臺是通過 CORS 處理跨域,沒有對請求頭的 Origin 做白名單限制,ACAO 響應頭是 * 或者包括黑客頁面,包括 Get/Post/Del 等操作,也是能被黑客頁面拿到的。

除了這兩種特殊情況,讀操作都是不能被攻擊到的,因爲瀏覽器跨域限制是天然的安全的。關於跨域知識細節,我寫過另外一篇文章。

知道攻擊原理,防護方法也很簡單,找到能夠區分請求發送的頁面是自己的頁面還是黑客的頁面的方法就可以了。

HTTP 請求頭 Referrer 字段是瀏覽器默認帶上,含義是發送請求的頁面地址,比如同樣是刪除相冊的操作 http://www.photo.com/del?id=xxx; 如果是從相冊自己頁面發送出來,Referrre 的值是 http://www.photo.com/index.html(以首頁舉例),如果是從黑客頁面發送出來的 Referrer 的值是 http://www.hacker.com/index.html(以首頁舉例),所以後端只要通過 Referrrer 做白名單判斷就能防這種常見的 CSRF 攻擊。

Referrer 會不會被僞造或者篡改?在瀏覽器環境下,Referrer 是瀏覽器自己帶上的,js 是改不了 Rerferrer,所以是不能被僞造和篡改的。瀏覽器插件能改 Referre,通過網關或者抓包也能修改 Referrer。除了這幾種特殊情況,用 Referrer 防 CSRF 是安全的。

讀寫 Cookie 有跨域限制 (作用域,Domain,Path),所以我們可以用這個特性來區分是自己頁面還是黑客頁面。只要頁面能讀(或者寫)www.photo.com 域名 Cookie, 就證明是自己的頁面。懂了原理,方案就很簡單,比如服務器通過 cookie 下發一個 token,token 值是隨機數,頁面發請求的時候從 cookie 取出 token 通過 HTTP 請求參數傳給後臺,後臺比對參數裏的 token 和 cookie 裏的 token 是否一致,如果一致就證明是自己頁面發的請求,如果不一致就返回失敗。防 CSRF 的方案就是這麼簡單,這種方法能夠 100% 防 CSRF。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/eYdF76ytxcb9bE6coVgV3g