【问题标题】:Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script Content Security Policy directive:default-src self拒绝将字符串评估为 JavaScript,因为 \'unsafe-eval\' 不是允许的脚本源内容安全策略指令:default-src self
【发布时间】:2023-01-11 06:57:32
【问题描述】:

在我的应用程序中,我想要内容安全策略:所有指令都应设置为自我,但是当我尝试这样做时,它显示以下错误

未捕获的 EvalError:拒绝将字符串评估为 JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本源:“default-src 'self';”。

at Function (<anonymous>)
at Function._init (yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.js:8:3195)
at yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.js:9:4331
at yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.js:9:4558

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“不安全内联”关键字、散列(“sha256-BfUVqxUMiFIZGvtAvlU3O1tTN9idUT5IuAIpMSM2F5g=”)或随机数(“nonce-...”)。另请注意,未明确设置“script-src”,因此“default-src”用作后备。

拒绝加载样式表“https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&display=swap”,因为它违反了以下内容安全策略指令:“默认源'自我'”。请注意,未明确设置“style-src-elem”,因此“default-src”用作后备。

【问题讨论】:

  • 看来你没受过训练就坐在飞行员的座位上了。如果你想使用 CSP,那么你必须学习how it works

标签: javascript http-headers


【解决方案1】:

内容安全策略必须有这个指令:

default-src 'self';
script-src 'self' 'unsafe-eval'; 
style-src 'self' fonts.googleapis.com;

和更多。

【讨论】:

  • 你好,'unsafe-eval' 和 'unsafe-inline' 不应包含在 CSP 中。
  • 如果您了解风险就可以了,如果您不能更改您的应用程序,这是一种权衡。您只需添加它或重写您的应用程序,这样它就不会违反您的政策。那么,问题是,你的问题是什么?
  • 我正在使用默认情况下 yui-combo.php 已经存在的 Moodle。在 VAPT(安全测试)期间,观察到未设置以下提到的 HTTP 标头:1. Strict-Transport-Security:max-age=16070400; includeSubDomains 2. X-Frame-Options, Frame-Options X-Frame-Options: deny 3. X-XSS-Protection: 1; mode=block 4. X-Content-Type-Options: nosniff 5. 内容安全策略:所有指令都应该设置为 self 'unsafe-eval' 并且 'unsafe-inline' 不应包含在 CSP 中。所有四个都已完成,但对于第 5 点,我收到此错误。
  • 为了遵守只允许 default-src 'self' 的策略,您需要重写您的页面和 HTML,以便它只从您自己的站点加载资源,而不加载任何外部请求,如 fonts.googleapis.com。但实际上,作为妥协,大多数使用 CSP 的站点都会允许某些域,例如 fonts.googleapis.com。这是安全性之间的权衡,重写您的应用程序/站点以符合策略的实用性和成本......
  • 在本地下载文件并将其添加到您的站点:fonts.googleapis.com/…' 或接受并信任 fonts.googleapis.com?
【解决方案2】:

如果您正在使用头盔在您的 Node.JS 服务器上,您可以配置以下内容:

server.use(helmet({
    contentSecurityPolicy: false
}));

或者您可以配置以下内容以将特定域列入白名单:

server.use(
  helmet.contentSecurityPolicy({
    directives: {
      "script-src": ["'self'", "example.com"],
      "style-src": null,
    },
  })
);

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 2018-01-15
    • 1970-01-01
    • 2012-09-17
    • 2016-04-23
    • 2016-08-27
    • 2022-01-19
    • 2014-09-08
    • 2018-12-25
    相关资源
    最近更新 更多