簡體   English   中英

三層應用程序是否需要 AntiForgeryToken?

[英]Is AntiForgeryToken required in three tier application?

我的安全掃描檢測到類型為“Missing AntiForgeryToken implementation”的問題。 我的應用程序有一層 .netCore WebApi 服務,一個帶有 RazorPages 服務的 .netCore WebApi 和一個 Angular 前端應用程序。 在線閱讀所有 CSRF Token 實現均指 RazorPages 或類似但不是前端應用程序。 問題是:三層架構是否需要令牌? 我必須用我的 fe 實施該政策嗎? 該工具檢測到的是真正的問題嗎?

謝謝。

首先,有必要了解什么是antiforgerytoken? 這與n層無關。 如果您的項目有 web 個頁面並且您正在發出 http 次請求,您應該使用 AntiforgeryToken 以確保安全。

架構無關緊要。

“經驗法則”是,如果您的應用程序中有用戶上下文,那么您需要一個防偽令牌實現來防止攻擊,例如:

攻擊者使用惡意代碼誘使用戶訪問另一個 web 頁面(例如 evil.com),該惡意代碼會秘密向應用程序的 web 服務器(例如 example-bank.com)發送惡意請求。

假設用戶在 example-bank.com 登錄到應用程序。 用戶打開 email 並單擊指向 evil.com 的鏈接,該鏈接將在新選項卡中打開。

evil.com 頁面立即向 example-bank.com 發送惡意請求。 也許這是一個將錢從用戶賬戶轉移到攻擊者賬戶的請求。 瀏覽器隨此請求自動發送 example-bank.com cookies(包括身份驗證 cookie)。

如果 example-bank.com 服務器缺乏 XSRF 保護,它就無法區分來自應用程序的合法請求和來自 evil.com 的偽造請求。

參考

Angular 的 HttpClient默認啟用 XSRF Token 支持:

HttpClient 支持用於防止 XSRF 攻擊的通用機制。 當執行 HTTP 請求時,攔截器從 cookie 中讀取令牌,默認為 XSRF-TOKEN,並將其設置為 HTTP header,X-XSRF-TOKEN。 因為只有在您的域上運行的代碼才能讀取 cookie,后端可以確定 HTTP 請求來自您的客戶端應用程序,而不是攻擊者。

默認情況下,攔截器將此 header 發送到相對 URL 的所有變異請求(例如 POST),但不會發送到 GET/HEAD 請求或具有絕對 URL 的請求。

要利用這一點,您的服務器需要在頁面加載或第一個 GET 請求時在名為 XSRF-TOKEN 的 JavaScript 可讀 session cookie 中設置一個令牌。 在后續請求中,服務器可以驗證 cookie 是否與 X-XSRF-TOKEN HTTP header 匹配,因此請確保只有在您的域上運行的代碼才能發送請求。 令牌對於每個用戶必須是唯一的,並且必須能夠被服務器驗證; 這可以防止客戶端制作自己的令牌。 將令牌設置為您站點的身份驗證 cookie 的摘要,並加鹽以增加安全性。

參考

在 .net 端實施也相對直接。

services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");

底層架構並不重要。 真正的問題是您的 Angular 客戶端如何對與之交談的對象進行身份驗證。

如果它使用瀏覽器自動發送的方法(通常像 cookies,但也例如 Windows auth / SPNEGO,這可能與您的堆棧相關),那么是的,您確實需要針對 CSRF 實施保護。

但是,如果您的身份驗證是基於作為請求 header 發送的令牌(或者甚至在請求主體中,但重點是,瀏覽器不會自動),那么不,您的應用程序本質上不易受到典型的 CSRF 攻擊,並且您不需要進一步的保護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM