我想知道是否可以修改
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 内,并且在更改时不必重建。
这可能吗?
我相信您正在寻找的是 Context.Response.Headers["Content-Security.Policy"].Replace("{injectMe}", nonce);
如果我是正确的,这应该获取正在发起的请求的当前上下文。
正如 @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 以进行差异跟踪的旁白
<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:;
(注意 指令之前的几个空格)。
<appSettings>
<add name="Content-Security-Policy" value="
default-src 'self';
img-src 'self' 'unsafe-inline' data:;
" />
</appSettings>