将随机数添加到破坏 'unsafe-eval' 的第 3 方代码的脚本标记

adding nonce to script tag for 3rd party code that breaks 'unsafe-eval'

我们正在使用 netlify-cms,不幸的是它发出的代码会破坏 CONTENT-SECURITY-POLICY 'unsafe-eval'

我尝试使用 nginx sub_filter:

向所有脚本标签添加 nonce 属性
server {
  listen       80;
  set_secure_random_alphanum $cspNonce 32;
  sub_filter_once off;
  sub_filter_types *;
  sub_filter *CSP_NONCE* $cspNonce;
  sub_filter '<script' '<script nonce=\'$cspNonce\' ';
  sub_filter '<link' '<link nonce="$cspNonce" ';

然后我将随机数添加到 header 也

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-$cspNonce' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' petstore.swagger.io;connect-src 'self' petstore.swagger.io";

我可以看到脚本标签中的随机数和 header 都匹配:

<script nonce='72UTQMpuXxfwcevvTydWt8XvOSzKhhjM' >

header

Content-Security-Policy default-src 'self'; script-src 'self' 'nonce-77Fdz6e1aBiGr5b8qcReeUgkO2NtJnSm'

但我仍然收到错误消息:

EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'nonce-77Fdz6e1aBiGr5b8qcReeUgkO2NtJnSm'

通过使用 'nonce-value',您只能删除 'unsafe-inline',但不能删除 'unsafe-eval'

'unsafe-eval' 在 Netlify 中需要将 JSON 编译成 JS 代码,但你也可以去掉 'unsafe-eval'。只需更新 ajv-json-loader 以使用 AJV 7 和独立模式,并配置 webpack 配置以使用更新的加载程序。见实事求是 here.