【问题标题】:Loading of a resource blocked by Content Security Policy加载内容安全策略阻止的资源
【发布时间】:2019-05-30 22:15:34
【问题描述】:

我在浏览器的控制台中收到以下错误:

内容安全政策:页面的设置阻止了在http://localhost:3000/favicon.ico(“default-src”)处加载资源。

我在网上查了一下,应该是用下面代码的sn-p解决的:

<meta http-equiv="Content-Security-Policy" content="default-src *;
    img-src * 'self' data: https: http:;
    script-src 'self' 'unsafe-inline' 'unsafe-eval' *;
    style-src  'self' 'unsafe-inline' *">

我将此添加到我的前端 app.component.html 文件(我所有前端视图的父模板),但这没有按预期工作。

我也尝试了多种排列,但无济于事。

我的前端位于localhost:4200,后端位于localhost:3000

下面是我的后端服务器(中间件)的代码 sn-p:

app.use(cors());
app.options('*',cors());
var allowCrossDomain = function(req,res,next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}
app.use(allowCrossDomain);

我现在还向我的后端 (Express) 服务器添加了以下中间件:

const csp = require('express-csp-header');

app.use(csp({
  policies: {
      'default-src': [csp.SELF, 'http://localhost:3000/', 'http://localhost:4200/' ],
      'script-src': [csp.SELF, csp.INLINE],
      'style-src': [csp.SELF],
      'img-src': ['data:', 'favico.ico'],
      'worker-src': [csp.NONE],
      'block-all-mixed-content': true
  }
}));

。 . .但仍未解决问题。

这是截图:

我做错了什么,我该如何解决?

【问题讨论】:

  • 您也可以通过 https 服务您的资源。一个文件可以破坏整个链条。
  • 原始 CSP 设置在哪里(可能是服务器,在标头中)?如果您只是尝试调试您的策略并添加所有这些额外的允许行,那没关系,但如果这是您计划投入生产的内容,您不妨完全删除 CSP。您应该了解 CSP 的目的是为了正确配置它。 developer.mozilla.org/en-US/docs/Web/HTTP/CSP

标签: express content-security-policy


【解决方案1】:

内容安全策略 (CSP) 是一种有助于防止跨站脚本 (XSS) 的机制,最好在服务器端处理;请注意,它也可以在客户端处理,使用 HTML 的 &lt;meta&gt; 标记元素。

配置并启用后,Web 服务器将在 HTTP 响应标头中返回适当的 Content-Security-Policy

您可能想在 HTML5Rocks 网站和 Mozilla 开发者页面 herehere 上阅读有关 CSP 的更多信息。

Google CSP Evaluator 是一款方便且免费的在线工具,可帮助您测试网站或 Web 应用程序的 CSP。

在您的实例中,您可能需要在不使用 https: 指令将 HTTPS 作为协议的情况下添加以下行;
因为您的网站或应用程序(如共享)不能通过 HTTPS 使用。 em>

res.header('Content-Security-Policy', 'img-src 'self'');

default-src 指令设置为 none 开始是开始部署 CSP 设置的好方法。

如果您选择使用Content-Security-Policy middleware for Express ,您可以按照下面的 sn-p 所示开始;

const csp = require('express-csp-header');
app.use(csp({
    policies: {
        'default-src': [csp.NONE],
        'img-src': [csp.SELF],
    }
}));

// HTTP response header will be defined as:
// "Content-Security-Policy: default-src 'none'; img-src 'self';"

请记住,CSP 是特定于案例或应用程序的,并且基于您的项目要求。

因此,您需要进行微调以满足您的需求。

【讨论】:

  • 非常感谢。我在前端和后端都将default-src 设置为none,但这仍然没有解决问题。还有其他想法吗?谢了!
  • @Crowdpleasr:您是否将img-src 设置为self?如果您仍有挑战,请执行并分享您的控制台浏览器的屏幕截图。
  • 谢谢。我在前端和后端都将img-src 设置为self,并添加了控制台浏览器的屏幕截图。再次感谢您的帮助!
  • 疯狂的是该应用程序运行了好几天。然后我今天给后端加了POST路由,现在突然有这个CSP问题解决不了了。
  • 在聊天中继续讨论对我们其他试图解决这个问题的人没有帮助。
【解决方案2】:
  • /favicon.ico 由 Web 浏览器在没有其他网站图标的 URL 时自动加载。这是通过以下方式指定的: https://html.spec.whatwg.org/#rel-icon
  • 您当前的 Content-Security-Policy 阻止了它。你需要使用类似的东西:Content-Security-Policy: img-src 'self'

理想情况下,Web 浏览器甚至不应该尝试 /favicon.ico,因为它会被阻止。毕竟,加载 /favicon.ico 是由 Web 浏览器触发的,而不是开发人员。 我修补了 chrome (version >= 88) 以消除错误:

https://chromium-review.googlesource.com/c/chromium/src/+/2438388


【讨论】:

    【解决方案3】:

    nyedidikeke 的回答太棒了!

    使用express-csp-header 中间件,设置policies 以通过CSP。
    https://www.npmjs.com/package/express-csp-header

    这是我的 ndoejs 代码:

    const { expressCspHeader, INLINE, NONE, SELF } = require('express-csp-header');
    const app = express();
    // other app.use() options ...
    app.use(expressCspHeader({ 
        policies: { 
            'default-src': [expressCspHeader.NONE], 
            'img-src': [expressCspHeader.SELF], 
        } 
    }));  
    

    尽情享受吧!

    【讨论】:

      【解决方案4】:

      如果您有严格的 CSP 标头,例如图片和其他静态文件,如

      Content-Security-Policy: default-src 'none';
      

      那么 Firefox 将假定这也意味着 隐式 引用 /favicon.ico 用于标签图标也被禁止。 Chrome 有内部特殊情况,无论 CSP 标头如何,始终允许隐式 /favicon.ico。要授予 Firefox 对隐式 /favicon.ico 的访问权限,您必须至少添加 img-src 'self'

      Content-Security-Policy: default-src 'none'; img-src 'self';
      

      另请注意,Content-Security-Policy 策略的语法 仅支持允许特定来源而不支持 URL。最初的问题有img-src ... favicon.ico,它应该刚刚说img-src ... 'self'。 (CSP 版本 2 对源中的前缀路径的支持有限,但它具有非常复杂的带有重定向的边缘情况,因此您应该尽可能避免使用该功能。)

      【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2016-01-31
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2020-12-17
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多