You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除后端CSP的unsafe-eval后,旧Angular库前端适配问题求助

解决Angular 2项目移除CSP头unsafe-eval后的执行报错问题

问题本质

你当前的操作存在概念错误:nonce属性仅用于验证脚本文件的合法性,无法替代CSP中unsafe-eval的权限。Angular 2的JIT编译器(你引入的这些umd.min.js包)依赖eval/new Function()动态生成代码,这种行为必须在CSP中明确授权,否则会触发报错。

可行解决方案

方案1:调整CSP头,精细授权(推荐)

如果后端允许修改CSP配置,不要完全移除unsafe-eval,而是结合nonce做更安全的控制,将CSP的script-src指令改为:

script-src 'self' 'nonce-0ZshCIvzxPX6s9n1bpbscg==' 'unsafe-eval';

该配置既通过nonce验证所有脚本文件的合法性,又允许Angular JIT编译所需的eval操作,兼顾安全与功能。

方案2:改用Angular 2 AOT编译包(彻底解决依赖)

Angular 2支持AOT(提前编译),编译后的代码不依赖动态eval。操作步骤:

  • 下载对应版本的Angular AOT编译工具包(如@angular/compiler-cli)和预编译后的静态脚本包
  • 提前编译项目中的组件模板与业务代码,生成无需JIT的静态脚本
  • 替换当前手动引入的JIT版本umd包为AOT编译后的脚本
    此方案能彻底摆脱对unsafe-eval的依赖,但需要适配老旧项目的构建流程,工作量较大。

方案3:修复错误的nonce用法(配合方案1生效)

你当前将'unsafe-eval'追加到nonce属性值的操作完全无效,正确的nonce属性应仅包含随机串,所有脚本统一使用同一个合法nonce:

<script nonce="0ZshCIvzxPX6s9n1bpbscg==" src="/fico/js/jquery.min.js?_=1686640599583"></script>
<script nonce="0ZshCIvzxPX6s9n1bpbscg==" src="/fico/js/bootstrap.min.js?_=1686640599583"></script>

<script nonce="0ZshCIvzxPX6s9n1bpbscg==" type="text/javascript" src="/common/npmcdn.com/core-js/client/shim.min.js?_=1686640599584"></script>
<!-- 所有其他脚本的nonce保持一致,不要添加额外内容 -->

注意:此修复仅纠正nonce的用法,必须配合方案1的CSP调整才能解决eval报错问题。

错误原因说明

从报错栈可以看到,compiler.umd.min.js中的evalExpression方法调用了new Function(),这属于CSP中unsafe-eval管控的范畴。nonce仅负责验证脚本文件本身是否被允许加载,无法授权脚本内部执行动态代码的行为,因此必须在CSP中明确允许unsafe-eval才能解决该问题。

内容的提问来源于stack exchange,提问作者bateda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:15:07