我已经实现了代码来管理我的应用程序中的内容安全策略层。
我的实现基于ActionFilterAttribute
,它受到了此处可用代码的启发(为了简单起见,我将问题包括在内)。
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)。这是显示标题的开发者控制台:
这些是控制台错误
我做错了什么,尤其是控制台中的最后三个错误?
答案 0 :(得分: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
和https://fonts.googleapis.com
来源提供原始值data:
在其中设置标记中的data:image/gif
网址如果文档真的也在加载来自https://localhost:5000
的资源,那么你也需要在那里加载资源。
如果您的后端已经有一些其他部分正在添加CSP标头,那么了解您使用其他CSP标头添加的任何策略只会使策略更严格,而不是更自由。
因此,如果在其他位置添加的CSP标头比您需要的更严格,那么您必须找到系统中添加该标题的部分,并使其停止。然后你可以添加你需要的更自由的CSP标题。