跨站点请求伪造(CSRF)总结和防御
什么是CRSF
構建一個地址,比如說是刪除某個博客網站博客的鏈接,然后誘使已經登錄過該網站的用戶點擊惡意鏈接,可能會導致用戶通過自己的手將曾經發布在該網站的博客在不知情的情況下刪除了。這種構建惡意鏈接,假借受害者的手造成損失的攻擊方式就叫CSRF-跨站點請求偽造。
瀏覽器Cookie策略
cookie分類
cookie根據有無設置過期時間分為兩種,沒有設置過期時間的為Session Cookie(會話cookie),firefoox有標注哪些cookie是會話cookie,這種cookie保存在內存空間中,在瀏覽器進程的生命周期中都有效,但是一關閉瀏覽器就被抹除。另外一種設置過期時間的叫做third-party Cookie,也稱之為本地cookie,保存在本地,在過期時間內都可以使用。
CSRF實現原理
一般用戶的操作都需要登錄以后才能進行,csrf就是利用用戶的登錄cookie,讓用戶在自己的惡意網站中向博客網站發送了刪除請求。比如讓用戶點擊鏈接黑客的網站,黑客在網站中加上一個圖片鏈接,該鏈接實際是向博客網站發送一個刪除請求:
惡意網站<html><p>這是黑客誘導客戶訪問的惡意網站地址</p><img src = "http://csdn.com?delete=10"></html> 復制代碼要實現這個還需要用到用戶登錄csdn后的cookie,之前談同源策略的時候說過,img、iframe之類的標簽不受同源策略的影響,所以當向csdn發送請求時,會將csdn相關的cookie都一并提交上去(會提交哪些cookie需要根據cookie作用域來決定),這樣csdn驗證cookie后誤認為是用戶在操作,實際上用戶是在無意識下刪除了自己的文章。
老版的ie,safari是禁止img、iframe標簽請求時發送cookie的,但是最新的firefox以及chrome等主流瀏覽器都是允許的。
對于老版的ie等是允許發送會話cookie的,如果想發送本地cookie,需要在網站返回給瀏覽器HTTP頭中含有P3P,這樣下一次訪問網站時將允許發送本地cookie。
同源策略是瀏覽器實現的,只要請求發出瀏覽器,同源策略和跨域就用不到了!
實踐
我在自己博客找到一個get請求(博客點贊請求):
從上圖可以看到點贊請求帶了一堆cookie驗證到后臺,現在我寫一個新界面,界面里面用img標簽跨域訪問這個請求(前提是csdn是登錄狀態,不然拿不到cookie驗證);啟動訪問本地請求:
上面的本地界面確實因為訪問csdn的請求而加載了一些csdn的cookie,其中應該包含了登陸驗證的字段,所以對應的這個服務應該成功了,檢查下那篇博客確實多了一個點贊。CSRF的防御
方案一 驗證碼
強制需要客戶進行交互才能操作。跟CSRF在客戶不知情的情況下完成攻擊的方式相餑
方案二 Referer Check
Referer Check最常見的應用就是防止圖片盜鏈,通過查看請求的來源判斷請求是否合理,比如通過攻擊者的網站嵌入訪問博客的地址,那referer就是攻擊者網站的地址,這樣很大程度能判斷出這是一個CSRF攻擊,但是這個方法的缺陷是:服務器并不是每次都能取到Referer信息。
方案三 構造不可預見性URL
CSRF能夠攻擊成功,其本質原因是請求的URL被攻擊者猜到,如果請求的URL具有不可預測性,那么攻擊者也就無從下手?,F在最通用的方式就是在URL中加入一個token參數。token可以存在用戶的cookie中,服務器也存有該客戶對應的token值。因為CSRF攻擊只是利用登錄cookie,并無法獲取cookie的具體值(除非用戶還被XSS攻擊了,導致cookie泄露,那就無濟于事了)。
token應該同時放在提交表單中與服務器session中,在有效時間之內,只要服務器session沒有被使用(即用戶沒有提交表單,這個需要服務器提供一個方案判斷某個session是否已經被使用過),都使用同一個token,否則需要重新生成token,并保存到表單和session中。
token也應該注意保密性,不應出現在url中,因為這樣可以通過referer獲取到,一個盡量放在表單中,把敏感的操作由GET改為POST,一form表單或者AJAX的形式提交,可以避免token泄露。
方案四: SameSite Cookie,防止 CSRF 攻擊
防止 CSRF 攻擊的辦法已經有 CSRF token 校驗和 Referer 請求頭校驗。為了從源頭上解決這個問題,Google 起草了一份草案來改進 HTTP 協議,那就是為 Set-Cookie 響應頭新增 SameSite 屬性,它用來標明這個 cookie 是個“同站 cookie”,同站 cookie 只能作為第一方 cookie,不能作為第三方 cookie。SameSite 有兩個屬性值,分別是 Strict 和 Lax www.cnblogs.com/ziyunfei/p/…
轉載于:https://juejin.im/post/5cea535ce51d45778f076c9c
總結
以上是生活随笔為你收集整理的跨站点请求伪造(CSRF)总结和防御的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux使用iptables设置黑白名
- 下一篇: Exchange 退信550 5.1.1