1. 程式人生 > >跨站點請求偽造(CSRF)

跨站點請求偽造(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。

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

CSRF的防禦

方案一 驗證碼

強制需要客戶進行互動才能操作。跟CSRF在客戶不知情的情況下完成攻擊的方式相餑

方案二 Referer Check

Referer Check最常見的應用就是防止圖片盜鏈,通過檢視請求的來源判斷請求是否合理,比如通過攻擊者的網站嵌入訪問部落格的地址,那referer就是攻擊者網站的地址,這樣很大程度能判斷出這是一個CSRF攻擊,但是這個方法的缺陷是:伺服器並不是每次都能取到Referer資訊

方案三 構造不可預見性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洩露。