【问题标题】:How to secure Blazor Server against cross-origin attacks?如何保护 Blazor Server 免受跨域攻击?
【发布时间】:2021-06-07 17:35:53
【问题描述】:

我想确保 Blazor Server 应用能够安全抵御跨域攻击,尤其是针对 Blazor Server 正在使用的 SignalR 集线器。据我所知,相关应用无需启用任何跨域连接。

Microsoft 有一个 Blazor Server Threat Mitigation 文档,其中说明了跨域保护的必要性(请参阅此处:Threat Mitigation)。该文档建议“打开恶意 WebSocket 也是可能的”,并且

  • Blazor 服务器应用可以跨域访问,除非额外 采取措施防止它。要禁用跨域访问, 通过添加 CORS 中间件来禁用端点中的 CORS 管道并将 DisableCorsAttribute 添加到 Blazor 端点元数据或通过配置限制允许的来源集 SignalR 用于跨域资源共享。
  • 如果启用了 CORS,额外的 根据 CORS,可能需要采取步骤来保护应用程序 配置。如果 CORS 已全局启用,则可以禁用 CORS 通过将 DisableCorsAttribute 元数据添加到 Blazor 服务器中心 在端点上调用 MapBlazorHub 后的端点元数据 路线建设者。

如果我正确理解上述内容,我需要“通过将 CORS 中间件添加到管道并将 DisableCorsAttribute 添加到 Blazor 端点元数据来禁用端点中的 CORS”,但到目前为止我一直无法弄清楚如何做这个。 [编辑:我认为我的回答涵盖了这部分问题。]

上述文章还引用了关于 SignalR 安全性的另一篇文章(参见此处:Security considerations in ASP.NET Core SignalR),其中说“CORS 提供的保护不适用于 WebSockets。有关 WebSockets 的来源限制,请阅读 WebSockets origin restriction”。

关于 WebSockets 源限制的文章描述了如何为 WebSockets 配置跨源保护,但是在配置 Blazor Server 使用的 WebSockets 的上下文中没有对此进行解释,我还没有弄清楚如何做到这一点。

如何确保我的 Blazor Server 应用程序可以安全地防止通过其 WebSocket 或任何其他相关连接机制向 SignalR 集线器发送跨源请求?

【问题讨论】:

    标签: websocket cors signalr blazor-server-side


    【解决方案1】:

    我想我已经找到了解决方案。我对此并不完全满意,但它似乎完成了这项工作。该解决方案分为三个部分:

    1. 按照文档中的建议将 DisableCorsAttribute 应用于 Blazor 端点。
    2. 阻止对 Blazor WebSockets 端点的跨域请求。
    3. 向 Blazor 端点应用授权(严格来说这与跨源请求无关,但我认为这里值得一提)。

    1。禁用CorsAttribute

    Startup.ConfigureServices() 添加services.AddCors(); - 我认为我不需要在此处添加策略,因为我实际上不想为我自己的站点以外的任何来源启用 cors。

    Startup.Configure() 中,在app.UseRouting(); 之后、app.UseEndpoints(); 之前的某处添加app.UseCors();

    使用 WithMetadata()DisableCorsAttribute 添加到 Blazor 终结点元数据:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub().WithMetadata(new DisableCorsAttribute());
        endpoints.MapFallbackToPage("/_Host");
    });
    

    2。阻止对 Blazor WebSockets 端点的跨域请求

    CORS 策略不适用于 websocket(因此很麻烦)。这个解决方案似乎有点hacky,但它似乎有效,我愿意接受改进或更好解决方案的建议。我在 Startup.Configure() 方法的顶部有这个,这样对 Blazor WebSockets 端点的跨域请求将被有效地忽略,而不是将错误代码返回给潜在的攻击者。

    app.Use(async (context, next) =>
    {
        if (context.Request.Path.Value == "/_blazor")
        {
            if (context.Request.Headers.TryGetValue("Origin", out var origin)
                && origin != $"https://{ context.Request.Host.Value }")
            {
                return; // Refuse to handle request
            }
        }
        await next();
    });
    

    3。授权

    我已经在此应用程序中使用基于 OIDC cookie 的身份验证,因此似乎值得对 Blazor 端点应用授权,以便只有经过身份验证的用户才能访问它。值得注意的是,这本身并不提供针对跨域攻击的保护,跨域攻击可能会以某种方式让经过身份验证的用户运行连接到我们的 Blazor 端点的代码,因为 OIDC cookie 是 SameSite=None 出于必要。不过,这似乎是值得应用的保护。

    这是通过将.RequireAuthorization() 添加到MapBlazorHub() 来实现的。

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub()
            .RequireAuthorization()
            .WithMetadata(new DisableCorsAttribute());
        endpoints.MapFallbackToPage("/_Host");
    });
    

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 2020-05-12
      • 2016-10-28
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多