Express项目生成apiDoc后访问路径报unsafe-eval CSP错误如何解决
错误触发原因
- 你使用的
apidoc@0.28.1版本依赖Handlebars模板引擎做前端页面渲染,Handlebars的模板编译逻辑需要调用eval类的动态JS执行能力 - 你的Express服务配置了Content Security Policy(CSP)安全规则,其中
script-src指令仅允许加载同源脚本('self'),明确禁止了unsafe-eval动态执行能力,所以浏览器拦截了Handlebars的执行逻辑,抛出报错。
大部分情况下这个严格CSP规则是由helmet安全中间件默认开启的,也有可能是你手动在响应头中配置的。
解决方法
可根据你的项目配置选择对应方案:
场景1:项目使用了helmet中间件
方案1:全局调整CSP规则(配置简单)
在helmet配置中新增unsafe-eval到script-src的允许列表:
const helmet = require('helmet'); app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'", "'unsafe-eval'"], // 新增unsafe-eval规则 // 保留你原有其他CSP配置项即可 } } }));
方案2:仅对apidoc路由放宽CSP规则(安全性更高,推荐)
不对全局规则做修改,仅在托管apidoc静态资源的路由单独配置宽松CSP:
const express = require('express'); const path = require('path'); const apidocPath = path.join(__dirname, 'api_docs'); // 替换为你的api_docs文件夹实际路径 // 优先配置apidoc路由的特殊CSP规则 app.use('/apidoc', (req, res, next) => { res.setHeader( 'Content-Security-Policy', "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" ); next(); }, express.static(apidocPath)); // 其他路由继续使用原来的严格helmet/CSP规则 app.use(helmet());
场景2:手动配置了CSP响应头
找到你设置Content-Security-Policy响应头的代码,在script-src的允许值中添加'unsafe-eval'即可,同样建议仅针对apidoc路由做修改,避免影响其他业务接口的安全性。
场景3:不想修改服务端CSP配置
可以降级apidoc到0.27.x版本,该版本的前端渲染逻辑不依赖unsafe-eval能力,不会触发该报错:
npm uninstall apidoc npm install apidoc@0.27.1 --save-dev
重新生成api文档后即可正常访问。
内容的提问来源于stack exchange,提问作者Kazi Rahamatullah
相关产品推荐
相关产品推荐

