【问题标题】:Content Security Policy: The page’s settings blocked the loading of a resource at inline (“default-src”)内容安全策略:页面的设置阻止了内联资源的加载(“default-src”)
【发布时间】:2020-12-17 23:27:40
【问题描述】:

我知道有很多类似的问题。但是,我还是 MERN 的新手,我正在寻找这个问题的简化答案。

我正在关注 MERN 堆栈上的教程,该应用程序是一个简单的费用计算器,在我们继续添加 Express 和 Mongoose 之前,所有功能都运行良好。这是 server.js 文件,所以你可以看到我的烂摊子:

const path = require('path');
const express = require('express');
const dotenv = require('dotenv');
const colors = require('colors');
const morgan = require('morgan');
const transactions = require('./routes/transactions');
const connectDB = require('./config/db');

dotenv.config({ path: './config/config.env' });

connectDB();

const app = express();

app.use(express.json());


if(process.env.NODE_ENV === 'development') {
    app.use(morgan('dev'));
}

app.use('api/v1/transactions', transactions);

if(process.env.NODE_ENV === 'production') {
    app.use(express.static('client/build'));

    app.get('*', (req, res) => res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html')));
}

const PORT = process.env.PORT || 5000;

app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`));

我在 package.json 中正确导入了所有内容,因此可能没有必要在聊天中发送垃圾邮件。我已连接到 Mongodb,但我确信这并没有什么不同。无论如何,当我使用命令启动它时,(npm run start),服务器在 localhost:5000 上运行,我立即在 html 页面上看到 Cannot GET /。 在 Firefox 的控制台中,我收到错误消息:

Content Security Policy: The page’s settings blocked the loading of a resource at inline (“default-src”). injectGlobalHook.js:513:49

在 Chrome 上显示:

... it violates the following Content Security Policy directive: "default-src 'none'". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback.

还在我的终端中显示 GET / 404 2.201 ms - 139,但仅在我刷新页面时才会显示。所以我知道这个错误与CSP有关,它在一个我不应该接触也没有接触过的文件中,但我不知道如何修复它。我以前遇到过错误,但我想我只是放弃了那个项目。一个答案会很好,但解释我为什么会收到这个错误会更好。谢谢!

【问题讨论】:

  • 我认为你需要修改 csp 以允许 img-src default-src 'none'; img-src: 'self'
  • 您需要指定更多的内容安全策略。请在下面检查我的答案。还可以在此处检查您当前的安全级别 -> securityheaders.com

标签: node.js mongodb express mongoose content-security-policy


【解决方案1】:

我强烈建议使用头盔库 (https://helmetjs.github.io/) 保护您的标题,但您需要小心,因为默认情况下头盔会阻止您的页面脚本,例如AJAX 请求,因此当使用默认值时,您会收到错误消息,例如:Content Security Policy: The page's settings blocks the loading of an resource at inline ("default/src") or similar, to fix this I需要手动编写头盔选项。

在我的项目中,我使用了以下配置:

app.use(
    helmet.contentSecurityPolicy({
      useDefaults: false,
      "block-all-mixed-content": true,
      "upgrade-insecure-requests": true,
      directives: {
        "default-src": [
            "'self'"
        ],
        "base-uri": "'self'",
        "font-src": [
            "'self'",
            "https:",
            "data:"
        ],
        "frame-ancestors": [
            "'self'"
        ],
        "img-src": [
            "'self'",
            "data:"
        ],
        "object-src": [
            "'none'"
        ],
        "script-src": [
            "'self'",
            "https://cdnjs.cloudflare.com"
        ],
        "script-src-attr": "'none'",
        "style-src": [
            "'self'",
            "https://cdnjs.cloudflare.com"
        ],
      },
    }),
    helmet.dnsPrefetchControl({
        allow: true
    }),
    helmet.frameguard({
        action: "deny"
    }),
    helmet.hidePoweredBy(),
    helmet.hsts({
        maxAge: 123456,
        includeSubDomains: false
    }),
    helmet.ieNoOpen(),
    helmet.noSniff(),
    helmet.referrerPolicy({
        policy: [ "origin", "unsafe-url" ]
    }),
    helmet.xssFilter()

我禁用了手动编写所有内容的默认设置,因为我可能有外部脚本、请求等,所以我需要另外定义它们。

此配置将解决阻塞的资源错误,例如:

  • 内容安全政策:页面设置阻止了内联(“default/src”)资源的加载
  • 内容安全政策:页面设置阻止了内联(“img/src”)资源的加载
  • 内容安全政策:页面设置阻止了内联(“script/src”)资源的加载

【讨论】:

  • 'self' 是您的域,因此它将允许从您的域(即服务器)加载资源。另外,您可以在数组中指定外部域,例如:'https://cdnjs.cloudflare.com"
  • 更多关于头盔选项的信息在这里-> helmetjs.github.io
【解决方案2】:

可以在 index.html(前端)或 Web 服务器(后端)中定义 CSP。

如果是前端,你应该找到类似的东西:

<html>
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=11"/>
        <meta http-equiv="Cache-Control" content="no-cache"/>
        <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self';"/>
        <title>
        </title>
    </head> 

根据你的报错信息,需要更换

default-src 'none'

通过

default-src 'self'

至于后端,显然您的 NodeJS 代码中没有 CSP 引用。

【讨论】:

  • 很好,但还不够。您可以在此处检查您的标头安全级别 -> securityheaders.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多