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ç
相关产品推荐
相关产品推荐

