是否可以编辑 IIS / web.config 设置的自定义 Content-Security-Policy 标头?

问题描述 投票:0回答:2

我想知道是否可以修改

web.config
Content-Security-Policy
下设置的 <customHeaders> 标头。

如果可能的话,我想注入一个随机数值。我目前正在这样做,但我需要从 web.config 完全删除标头并通过

Application_BeginRequest()

添加它

我已经浏览了 global.asax 以获取标题。此时管道中似乎不存在。我只能假设它是稍后注入的?

<customHeaders>
     <add name="Content-Security-Policy" value="myCsp nonce-{injectMe}" />
</customHeaders>
// would like to do something akin to this:
protected void Application_BeginRequest()
{
    var nonce = 'myNonce';
    Response.Headers["Content-Security.Policy"] =
        Response.Headers["Content-Security.Policy"].Replace("{injectMe}", nonce);
}

目标是将 CSP 保留在 web.config 内,并且在更改时不必重建。

这可能吗?

asp.net-mvc iis content-security-policy
2个回答
2
投票

我相信您正在寻找的是 Context.Response.Headers["Content-Security.Policy"].Replace("{injectMe}", nonce);

如果我是正确的,这应该获取正在发起的请求的当前上下文。


0
投票

如何将 CSP 保留在 web.config 中并使其动态

正如 @monkeySeeMonkeyDo 和 @nicholas 在他们对原始问题的评论中所说,您无法更改通过

web.config
中的 <customHeaders> 部分定义的 Content-Security-Policy 标头,因为它是在您的应用程序完成后注入的处理了请求,因此永远无法通过
Context.Response.Headers
集合进行操作。

如果您需要动态的 Content-Security-Policy 标头,请不要在

<customHeaders>
部分中定义它,而是自己明确地编写它。如果我们假设您的内容安全策略模板及其 {injectMe} 占位符可在名为
cspTemplate
的应用程序设置变量中使用,那么您可以按如下方式添加标头。

    var nonce = "myNonce";
    var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    var cspTemplate = config.AppSettings.Settings["Content-Security-Policy-Template"].Value;
    Response.Headers.Add("Content-Security.Policy", cspTemplate.Replace("{injectMe}", nonce);

既定目标是将 CSP 保留在 web.config 内,这就是为什么将其定义为应用程序设置是一个很好的解决方案。但请注意,如果您这样做,则必须将其从

<customHeaders>
部分中删除,因为如果您将其留在那里并且还通过
Response.Headers
添加它,那么您最终将在您的回应,这可能不是你想要的。 关于格式化 CSP 以进行差异跟踪的旁白

如果将 CSP 移至应用程序设置,需要注意的一个微妙之处是,您可能会失去 ASP.NET 对 CSP 格式化方式进行自动重新格式化的好处。内容安全策略往往很长且难以阅读(并且很难使用 diff 工具跟踪更改),除非将它们分成几行。这在

<customHeaders>

部分非常有效,因为 ASP.NET 在将标头写入响应之前会自动去除无关的空格,因此下面定义的自定义标头会以整齐的行形式写入响应,如下所示

content-security-policy: default-src 'self'; img-src 'self' 'unsafe-inline' data:;

<customHeaders>
    <add name="Content-Security-Policy" value="
        default-src 'self';
        img-src 'self' 'unsafe-inline' data:;
" />
</customHeaders>

如果您将 CSP 移动到应用程序设置,如下所示,但在将其添加到
Response.Headers
之前您没有自己整理该值,那么 ASP.NET 仍会删除换行符,但不会删除其他空格,并且标头将作为

写入响应

content-security-policy: default-src 'self';        img-src 'self' 'unsafe-inline' data:;
(注意
img-src
 指令之前的几个空格)。
<appSettings> <add name="Content-Security-Policy" value=" default-src 'self'; img-src 'self' 'unsafe-inline' data:; " /> </appSettings>


© www.soinside.com 2019 - 2024. All rights reserved.