Asp net核心内容安全策略实施
问题描述:
我已经实现了代码来管理我的应用程序中的内容安全策略层。 我的实现基于一个ActionFilterAttribute
,该代码受此处可用代码的启发(为了简单起见,我在该问题中包含了该代码)。Asp net核心内容安全策略实施
public override void OnResultExecuting(ResultExecutingContext context) {
var result = context.Result;
if (result is ViewResult) {
if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Type-Options")) {
context.HttpContext.Response.Headers.Add("X-Content-Type-Options", "nosniff");
}
if (!context.HttpContext.Response.Headers.ContainsKey("X-Frame-Options")) {
context.HttpContext.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
}
var csp = "default-src *;";
// once for standards compliant browsers
if (!context.HttpContext.Response.Headers.ContainsKey("Content-Security-Policy")) {
context.HttpContext.Response.Headers.Add("Content-Security-Policy", csp);
}
// and once again for IE
if (!context.HttpContext.Response.Headers.ContainsKey("X-Content-Security-Policy")) {
context.HttpContext.Response.Headers.Add("X-Content-Security-Policy", csp);
}
}
}
然而,正如你可以从下面的图片看,我仍然可以在浏览器(Firefox样品中的)错误。这是显示这是目前的标头中的开发者控制台:
而这些控制台错误
什么我做错了,expecially在过去的三个误区安慰?
答
文件也真的从
为了消除在控制台屏幕捕获的CSP的错误,你必须让这个头发生:
Content-Security-Policy:
script-src 'self' https://cdnjs.cloudflare.com;
style-src 'self' https://fonts.googleapis.com;
img-src 'self' data:
(在上面显示被分解为多行只是为了可读性值)。
其要点是:
- 你需要有
'self'
在那里 - 你需要ŧ Ø给出了第三方
https://cdnjs.cloudflare.com
,你必须有data:
允许data:image/gif
网址在您的标记
而且,如果原点值https://fonts.googleapis.com
起源,你装字体和脚本从
https://localhost:5000
加载资源,那么你也需要在那里。 如果您的后端已经有一些其他部分添加了CSP头部,那么了解您使用额外的CSP头部添加的任何策略只能使策略更严格,而不是更自由。
因此,如果其他地方添加的CSP标头比您需要的标签更严格,那么您必须找到正在添加该标签的系统部分,并使其停止。然后你可以添加你需要的更宽松的CSP头。
问题中的代码片段似乎表明您正在设置一个Content-Security-Policy:default-src *标题,但开发者控制台屏幕截图显示了Content-Security-Policy:script- src'self; style-src'self',img-src'self''。为什么? – sideshowbarker
看起来,将内容安全策略添加到头部的代码块(具有符合标准的浏览器一次注释的那个代码块)不会运行,因为密钥已经存在于头部中。虽然解决方案可能很简单,但我想知道是谁添加了它...... – Lorenzo
那么我现在还注意到,显示的控制台错误是针对也具有'script-src:https:// localhost:5000'的CSP头以及'style-src:https:// localhost:5000' ... – sideshowbarker