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