2017-10-20 143 views
1

我已经实现了代码来管理我的应用程序中的内容安全策略层。 我的实现基于一个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样品中的)错误。这是显示这是目前的标头中的开发者控制台:

Request headers

而这些控制台错误

Console

什么我做错了,expecially在过去的三个误区安慰?

+0

问题中的代码片段似乎表明您正在设置一个Content-Security-Policy:default-src *标题,但开发者控制台屏幕截图显示了Content-Security-Policy:script- src'self; style-src'self',img-src'self''。为什么? – sideshowbarker

+0

看起来,将内容安全策略添加到头部的代码块(具有符合标准的浏览器一次注释的那个代码块)不会运行,因为密钥已经存在于头部中。虽然解决方案可能很简单,但我想知道是谁添加了它...... – Lorenzo

+0

那么我现在还注意到,显示的控制台错误是针对也具有'​​script-src:https:// localhost:5000'的CSP头以及'style-src:https:// localhost:5000' ... – sideshowbarker

回答

1

为了消除在控制台屏幕捕获的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头。