.net核心安全头中间件不向外部http请求添加头

时间:2017-04-19 19:43:52

标签: security asp.net-core asp.net-core-mvc .net-core asp.net-core-middleware

我在网络应用中使用安全标头中间件为所有传出的http请求添加安全标头。安全标头似乎被添加到内部资源的所有网络请求 - 这是构成Web应用程序的资源,例如javascript脚本和Web应用程序中使用的图像以及css和html文件。但是,安全标头不会添加到任何外部http请求中,例如我创建的Web应用程序用于获取json数据的API。我如何才能将安全标头添加到所有内容中,而不仅仅是添加到Web应用程序自己的资源?

以下是一些添加安全标头中间件的相关代码

startup.cs

private ILogger<SecurityHeadersBuilder> _logger;
private readonly SecurityHeadersPolicy _policy = new SecurityHeadersPolicy();

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ISecurityHeadersBuilder securityHeadersBuilder)
{...
    app.UseSecurityHeadersMiddleware(
        securityHeadersBuilder.AddDefaultSecurePolicy()
    );

securityHeadersBuilder.cs

public SecurityHeadersBuilder AddDefaultSecurePolicy()
{
    AddFrameOptionsDeny();
    AddXssProtectionBlock();
    AddContentTypeOptionsNoSniff();
    AddNoCache();
    AddStrictTransportSecurityMaxAgeIncludeSubDomains();
    AddContentSecurityPolicyAllContentFromSelfAndGoogle();
    RemoveServerHeader();
    return this;
}

public SecurityHeadersBuilder AddFrameOptionsDeny()
{
    _policy.SetHeaders[FrameOptionsConstants.Header] = FrameOptionsConstants.Deny;
    _logger.LogInformation(string.Format("setting {0} http header value to {1}", FrameOptionsConstants.Header, FrameOptionsConstants.Deny));
    return this;
}

1 个答案:

答案 0 :(得分:1)

有两种类型的标头:请求标头和_response标头。

服务器设置响应头以指示浏览器如何处理响应(例如阻止iframing)。 因此,使用(例如)标头X-Frame-Options : Deny进行请求是没有意义的。因为客户端应用程序可能会更改值并忽略安全限制。无论如何,服务器都不会处理标题的值,浏览器的用户代理将使用此响应标题。

如果您拨打(外部)API,则应手动将请求标头添加到HttpClient并拨打电话。 API又可以返回(安全)响应头。

示例代码中的所有标头都是响应标头,不应设置为 request 标头。