Handlebars.js: Chrome 扩展清单 v2 限制使用 eval

创建于 2013-02-25  ·  5评论  ·  资料来源: handlebars-lang/handlebars.js

由于新的安全策略限制使用 eval 和类似 eval 的语法,因此 Handlebars 在带有 manifest_version: 2 的 Chrome 扩展程序中将不起作用。

未捕获的 EvalError:拒绝将字符串评估为 JavaScript,因为在以下内容安全策略指令中,“unsafe-eval”不是允许的脚本来源:“script-src 'self' chrome-extension-resource:”。
把手.js:1402
JavaScriptCompiler.createFunctionContext handlebars.js:1402
JavaScriptCompiler.compile handlebars.js:1320
编译handlebars.js:2105
(匿名函数)handlebars.js:2112
(匿名函数) panel.js:14 <--- 我的脚本叫做 Handlebars.compile()

最有用的评论

这基本上违背了使用 CSP 来防止注入的全部意义。

所有5条评论

这是对框架设计的继承。 如果您在无法使用动态生成的 javascript 的环境中运行,则需要预编译模板并将生成的输出包含在包中。

这让我很困扰。 这是谷歌页面的引述:

“然而,我们认识到,各种库使用 eval() 和类似 eval 的构造,例如 new Function() 来优化性能和简化表达。模板库特别容易采用这种实现方式。_而一些(如 Angular .js) 开箱即用地支持 CSP,_许多流行的框架尚未更新为与扩展的无评估世界兼容的机制。因此,取消对该功能的支持已证明比开发人员预期的更成问题。”

那么,一些模板系统可以设法与 CSP 兼容,但不能与 Handlebars 兼容? 所以,既然我已经在我的项目中使用了 Handlebars,我只能通过 2 个选择来让我的应用程序符合 CSP:

1) 拆下把手
2)预编译我所有的模板。

鉴于我的模板的动态特性,预编译不是一种选择。 所以,现在我必须拆掉车把,因为这个缺陷已经关闭。

在这里不能遵循 CSP 指南吗?

“您可以通过将‘unsafe-eval’添加到您的来源列表中来允许它”

这基本上违背了使用 CSP 来防止注入的全部意义。

FWIW,Cloudant(基于 Apache CouchDB)最近更改了他们的数据库内脚本处理,以防止eval()new Function() https://console.bluemix.net/docs/services/Cloudant/release_info /deprecations.html#disabled -javascript-constructors

将模板预编译到 JS 中适用于某些场景,但不适用于所有场景。 如果有其他选择就太好了,这样 Handlebars.js 可以用在更多地方。

但是……这可能只是一厢情愿。 :笑脸:💭

此页面是否有帮助?
0 / 5 - 0 等级