项目

安全头信息

ABP 允许您为应用程序添加常用的安全头信息。如果使用 UseAbpSecurityHeaders 中间件,以下安全头将作为响应头添加到您的应用程序中:

  • X-Content-Type-Options:指示浏览器不要尝试猜测资源的 MIME 类型,而是直接采用服务器返回的 MIME 类型。
  • X-XSS-Protection:这是 Internet Explorer、Chrome 和 Safari 的一项功能,在检测到反射型跨站脚本(XSS)攻击时停止加载页面。
  • X-Frame-Options:此头信息可用于指示是否允许浏览器在 <iframe> 标签中渲染页面。通过将此头值指定为 SAMEORIGIN,可以使其在与页面本身同源的框架中显示。
  • Content-Security-Policy:此响应头允许您限制可以加载哪些资源(如 JavaScript、CSS、图像、清单等)以及这些资源可以从中加载的 URL。只有在配置 AbpSecurityHeadersOptions 类并启用它时,才会添加此安全头。

配置

AbpSecurityHeadersOptions

AbpSecurityHeadersOptions 是启用 Content-Security-Policy 头、定义其值以及设置要添加到应用程序的其他安全头的主要类。

示例:

Configure<AbpSecurityHeadersOptions>(options => 
{
    options.UseContentSecurityPolicyHeader = true; // 默认为 false
    options.ContentSecurityPolicyValue = "object-src 'none'; form-action 'self'; frame-ancestors 'none'"; // 默认值

    // 添加额外的安全头
    options.Headers["Referrer-Policy"] = "no-referrer";
});

如果头信息相同,您定义的额外安全头将优先于默认安全头。换句话说,它会覆盖默认安全头的值。

安全头中间件

安全头中间件是一个 ASP.NET Core 请求管道中间件,它将预定义的安全头添加到您的应用程序中,包括 X-Content-Type-OptionsX-XSS-ProtectionX-Frame-Options。此外,如果您如上所述配置了 AbpSecurityHeadersOptions,此中间件还会在您的应用程序中包含那些独特的安全头。

示例:

app.UseAbpSecurityHeaders();

您可以在模块类的 OnApplicationInitialization 方法中,在 app.UseRouting() 之后添加此中间件,以将其注册到请求管道中。此中间件已在 ABP Commercial 启动模板中配置,因此如果您使用这些启动模板之一,则无需手动添加。

之后,您已将 UseAbpSecurityHeaders 中间件注册到请求管道中,定义的安全头将显示在响应头中,如下图所示:

内容安全策略脚本 Nonce

ABP 提供了一个属性,用于向 Content-Security-Policy 头添加动态的 script-src nonce 值。通过此功能,它会自动向头端添加一个动态 nonce 值。并且借助脚本标签助手,它会将此 脚本 nonce 值添加到您页面上的脚本标签中(必须将 Volo.Abp.AspNetCore.Mvc.UI.Bundling 命名空间中的 ScriptNonceTagHelper 附加为标签助手)。

如果需要手动添加 nonce 脚本,可以使用 'Html.GetScriptNonce()' 来添加 nonce 值,或使用 'Html.GetScriptNonceAttribute()' 来添加 nonce 属性值。

此功能默认禁用。您可以通过将 AbpSecurityHeadersOptions 类的 UseContentSecurityPolicyScriptNonce 属性设置为 true 来启用它。

忽略脚本 Nonce

您可以忽略某些页面或某些选择器的脚本 nonce。您可以使用 AbpSecurityHeadersOptions 类的 IgnoredScriptNoncePathsIgnoredScriptNonceSelectors 属性。

示例:

Configure<AbpSecurityHeadersOptions>(options => 
{
    // 添加 script-src nonce
    options.UseContentSecurityPolicyScriptNonce = true; // 默认为 false

    // 忽略这些路径的脚本 nonce 源
    options.IgnoredScriptNoncePaths.Add("/my-page");

    // 通过 Elsa Workflows 和其他选择器忽略脚本 nonce
    options.IgnoredScriptNonceSelectors.Add(context =>
    {
        var endpoint = context.GetEndpoint();
        return Task.FromResult(endpoint?.Metadata.GetMetadata<PageRouteMetadata>()?.RouteTemplate == "/{YOURHOSTPAGE}");
    });
});

忽略 Abp 安全头

您可以忽略某些操作或页面的 Abp 安全头。您可以使用 IgnoreAbpSecurityHeaderAttribute 特性来实现这一点。

示例:

@using Volo.Abp.AspNetCore.Security
@attribute [IgnoreAbpSecurityHeaderAttribute]

示例:

[IgnoreAbpSecurityHeaderAttribute]
public class IndexModel : AbpPageModel
{
    public void OnGet()
    {
    }
}
在本文档中