跨站點請求僞造(CSRF)總結和防護

什麼是CRSF

構建一個地址,好比說是刪除某個博客網站博客的連接,而後誘使已經登陸過該網站的用戶點擊惡意連接,可能會致使用戶經過本身的手將曾經發布在該網站的博客在不知情的狀況下刪除了。這種構建惡意連接,假借受害者的手形成損失的攻擊方式就叫CSRF-跨站點請求僞造。html

瀏覽器Cookie策略

cookie分類

cookie根據有無設置過時時間分爲兩種,沒有設置過時時間的爲Session Cookie(會話cookie),firefoox有標註哪些cookie是會話cookie,這種cookie保存在內存空間中,在瀏覽器進程的生命週期中都有效,可是一關閉瀏覽器就被抹除。另一種設置過時時間的叫作third-party Cookie,也稱之爲本地cookie,保存在本地,在過時時間內均可以使用。chrome

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等主流瀏覽器都是容許的。bash

對於老版的ie等是容許發送會話cookie的,若是想發送本地cookie,須要在網站返回給瀏覽器HTTP頭中含有P3P,這樣下一次訪問網站時將容許發送本地cookie。服務器

同源策略是瀏覽器實現的,只要請求發出瀏覽器,同源策略和跨域就用不到了!cookie


實踐

我在本身博客找到一個get請求(博客點贊請求): session

在這裏插入圖片描述
從上圖能夠看到點贊請求帶了一堆cookie驗證到後臺,如今我寫一個新界面,界面裏面用img標籤跨域訪問這個請求(前提是csdn是登陸狀態,否則拿不到cookie驗證);

啓動訪問本地請求:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
上面的本地界面確實由於訪問csdn的請求而加載了一些csdn的cookie,其中應該包含了登錄驗證的字段,因此對應的這個服務應該成功了,檢查下那篇博客確實多了一個點贊。


CSRF的防護

方案一 驗證碼

強制須要客戶進行交互才能操做。跟CSRF在客戶不知情的狀況下完成攻擊的方式相餑網站

方案二 Referer Check

Referer Check最多見的應用就是防止圖片盜鏈,經過查看請求的來源判斷請求是否合理,好比經過攻擊者的網站嵌入訪問博客的地址,那referer就是攻擊者網站的地址,這樣很大程度能判斷出這是一個CSRF攻擊,可是這個方法的缺陷是:服務器並非每次都能取到Referer信息。url

方案三 構造不可預見性URL

CSRF可以攻擊成功,其本質緣由是請求的URL被攻擊者猜到,若是請求的URL具備不可預測性,那麼攻擊者也就無從下手。如今最通用的方式就是在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/…

相關文章
相關標籤/搜索