如何解决由于内容安全策略指令,无法在生产中的 Angular 应用程序中保存 PDF 文件
我有 Angular 应用。并且有保存pdf文件的功能。
import * as pdfMake from 'pdfmake';
...
createPdf(): void {
let docDefinition = {
header: 'C#Corner PDF Header',content: 'Simple pdf file'
};
pdfMake.createPdf(docDefinition).download('a.pdf');
}
它过去在本地和生产中都运行良好。但从某个时候开始,它开始在生产中失败,而本地一切都保持不变。
这是我在制作中收到的错误
ERROR EvalError:拒绝将字符串评估为 JavaScript,因为 'unsafe-eval' 不是以下脚本的允许来源 内容安全策略指令:“script-src 'self'”。
函数本身是否有错误?我该如何解决这个问题?
解决方法
pdfmake
lib 有很多不安全的 eval 表达式:eval() 和 new Function() 调用。因此,如果您使用内容安全策略 (CSP),则必须在 'unsafe-eval'
指令中使用 script-src
令牌。
但是,很明显,您并没有为 CSP 烦恼,所以这让您感到惊讶。
您很可能在生产服务器上使用 Helmet 等中间件。默认情况下,头盔 3 的 CSP 为“关闭”,但头盔 4 将其切换为“打开”。因此,您过去不会遇到任何麻烦,但是在升级 NodeJS 依赖项之后,您现在拥有了带有默认 CSP script src 'self'
的 Helmet 4。
您有 2 个选项:
- 在 Helmet 中禁用 CSP
- 通过
helmet.contentSecurityPolicy(options)
配置 CSP 并将'unsafe-eval'
令牌添加到script-src
指令中。如果您使用外部脚本/样式/字体,可能还需要添加其他源/键,但到目前为止没有其他 CSP 违规。
注意:关于 Helmet 4 只是猜测,可能您使用了其他中间件,它发布了 CSP HTTP 响应标头。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。