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

Angular项目配置CSP遇json-logic-engine用eval,如何规避'unsafe-eval'?

解决Angular项目中CSP与json-logic-engine eval冲突的方案

问题背景

当前你的CSP配置如下:

script-src 'self' 'nonce-anything';
style-src 'self' 'nonce-anything' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
upgrade-insecure-requests;
block-all-mixed-content;

由于使用的json-logic-engine库调用了eval函数,导致必须添加'unsafe-eval'才能正常运行,而nonce仅能豁免内联脚本,无法覆盖eval这类动态代码执行场景。

无需使用'unsafe-eval'的解决办法

1. 更换为无eval依赖的逻辑引擎库

查找并替换json-logic-engine为纯AST解析实现的逻辑引擎库,这类库会将JSON逻辑表达式转换为抽象语法树后执行,完全避免eval的使用。例如部分社区维护的json-logic-js分支,或其他如@ruleenginejs/core这类明确标注无eval依赖的库。

2. 修改json-logic-engine的源码,移除eval依赖

如果无法更换库,可以尝试修改json-logic-engine的核心代码:

  • 定位到库中调用eval的模块,将其替换为基于AST解析的执行逻辑。比如把字符串形式的表达式拆解为可遍历的语法节点,通过递归调用原生JavaScript操作符来实现逻辑计算,彻底摒弃eval。
  • 修改后可以将库作为本地依赖引入项目,或者提交PR给官方仓库。

3. 使用Trusted Types限制eval的使用范围(相对安全的折中方案)

虽然不能完全替代'unsafe-eval',但Trusted Types可以大幅降低风险:

  • 在Angular项目中启用Trusted Types,配置自定义政策,仅允许json-logic-engine生成的特定代码通过eval执行。
  • 具体操作时,需要封装json-logic-engine的调用逻辑,将生成的代码通过Trusted Types政策进行验证后再执行,同时在CSP中添加trusted-types <policy-name>,配合'unsafe-eval'使用(但此时的风险远低于直接开放'unsafe-eval')。

4. 预编译逻辑表达式(针对固定逻辑场景)

如果你的业务中逻辑表达式是固定或可预定义的,可以提前将这些表达式转换为静态JavaScript函数,直接集成到项目代码中,完全绕过json-logic-engine的动态解析逻辑,自然也就不需要eval了。

内容的提问来源于stack exchange,提问作者Safa Tunç

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:40:03