2017-05-26 143 views
3

我們正在用ASP.NET Core構建3個不同的應用程序MVC應用程序,API,SPA(不是Angular)。此應用程序中的所有操作僅適用於授權用戶。這就是我們用IdentityServer保護他們的原因。不記名令牌和CSRF

我們使用cookie來存儲不記名令牌的值。我知道cookie的價值會自動發送到服務器。但是,因爲它應該作爲授權頭添加,所以不會由瀏覽器自動完成。

這是否減輕了CSRF攻擊的可能性?或者CSRF仍然可以使用持票人令牌,我們是否還需要添加CSRF令牌?

回答

2

是的,你仍然需要CSRF令牌。

如果您的SPA或MVC應用程序將基於用戶的GET或POST操作向您的API發送請求,則仍需要CSRF令牌。

說有人誘騙用戶點擊觸發的動作在你的SPA,或者職位,以你的MVC應用程序的鏈接,該應用程序將愉快地遵守併發送存儲在cookie中的請求頭中承載的道理,就像當用戶點擊應用程序本身的鏈接時。

這就是CSRF的重點,攻擊者提出一個請求,就好像用戶在您的Web應用程序中調用了一個動作一樣。

1

如果我理解您正確,MVC和SPA都使用Identity Server對用戶進行身份驗證,並將Cookie中的令牌存儲在主要用於訪問API的Cookie中。

一般來說,有兩種情況在這裏:

  1. 你的cookies HTTP only(在前端無法訪問)。然後,您將cookie發送到MVC和SPA服務器端,以提取Cookie並將請求進一步發送到API。這種情況下,您像往常一樣易受CSRF攻擊,因爲您確實有效地使用cookie進行身份驗證,並且隨後的令牌提取和針對API的承載身份驗證僅基於自動cookie身份驗證的結果發生。

  2. Cookies可以在前臺訪問。這種情況下,您可以使用Javascript讀取它們,並向MVC和SPA服務器端發送經過身份驗證的請求(用於傳遞給API)或直接發送給API,使所有後端忽略可能受損的Cookie內容。 這種情況下,你不容易受CSRF攻擊(正如你指出承載認證頭必須明確構造)。但是,您很容易受到XSS(cross site scripting)的攻擊:任何通過數據驗證/衛生安全漏洞或簡單第三方依賴關係注入頁面的代碼都可以讀取cookie並將其重新發送到任何服務器。這種情況非常類似於使用本地/會話存儲,因此任何描述其漏洞的文章也適用於您的場景(例如here)。

所以,你必須採取CSRF或XSS之間的選擇作爲攻擊主力。

CSRF可以完全防止反僞造令牌,但如果您未能做到這一點,攻擊很容易組織。

由於您使用了大量的第三方庫,XSS在理論上很難完全防止在現代開發中(另一個XSS攻擊媒介 - 輸入衛生並不是一個常見問題,因爲大多數MVC框架都是這樣做的對你來說默認like ASP NET Core)。但是,您有避免它的公平機會,在許多情況下,這種選擇是合理的選擇e.g. Auth0 recommends it

+0

關於#1:SPA通常與AJAX請求一起工作,他們無法訪問HttpOnly cookie。 – CodeCaster

+1

這是正確的。這就是爲什麼我描述了兩個案例(HttpOnly而不是)。我看到有幾次cookies用作本地存儲,只要問題提到了頭文件驗證,我懷疑它暗示了從cookies中提取令牌 – Igor

+0

我看到我誤解了你。當cookie(帶有令牌,大概是)與Ajax請求一起發送時,#1正好是普通cookie身份驗證的情況。所以這裏沒有令牌提取和csrf漏洞。 – Igor