ASP.NET 核心 API 没有剃刀页面,使用单独的 Web 应用程序作为前端和防伪标记 - 这有意义吗?

ASP.NET Core API without razor pages, using separate web app for Front-End and Anti-Forgery tokens - does it make sense?

是否必须通过对严格后端 API 使用防伪令牌来解决 XSRF/CSRF 问题,最终将被迫执行跨站点 Web 请求使用向用户提供静态内容的单个特定 Web 域?

后端 API 使用 cookie 来帮助保持用户身份验证,因此需要考虑 CSRF,但是通过使用 CORS,后端 API 将只接受与特定域的通信。

这里有问题吗?而且,如果防伪令牌确实有意义,那么当前端位于一个完全独立的域中时,它们将如何使用? 它可以移动到子域。

我相信让您的软件安全始终是一件好事。

CORS 不是用于防止访问服务器资源的服务器端安全功能。它实际上是一种浏览器安全功能,可以防止从其他来源加载,除非源服务器上的 CORS 另有规定。这是由指定 Allow-Control-* headers.

的 pre-flight 请求(OPTIONS)完成的

例如,您在同一个 server/origin 上托管 front-end 和 API,但您使用的字体来自 Google API。除非 CORS 允许从 Google API 来源加载,否则该请求应被浏览器阻止。

由于它是浏览器功能,并不一定意味着每个浏览器都支持或强制执行它,因此您不能将其作为服务器端安全功能来依赖。也可以在不使用浏览器的情况下完成请求,例如卷曲。

另一方面,

Anti-forgery 令牌是减轻 XSRF/CSRF 攻击的服务器安全功能。那些试图利用 user/browser 和服务器之间的现有信任,并在受害者不了解攻击者来源的情况下执行操作。您可能觉得 CORS 会阻止来自攻击者的任何请求,但情况并非总是如此,因为某些请求在请求之前不使用 pre-flight。这些被称为简单请求。其中之一是 POST 请求,主要用于更改数据。没有 anti-forgery 令牌,攻击者可以利用它,CORS 将无济于事。

总而言之,我会说您应该使用 CORS 来限制浏览器仅从您允许的来源加载数据,并避免可能加载恶意代码并使用 Anti-forgery 令牌来保护写入操作(POSTPUTPATCHDELETE 方法)以减轻 XSRF/CSRF 攻击。

其他资源:

Cross-Origin Resource Sharing (CORS) at Mozilla

CSRF Explained | Understanding Cross Site Request Forgery | What is XSRF? on YouTube

CSRF protection with CORS Origin header vs. CSRF token on Whosebug