使用manifest_version: 2
限制使用eval
或new Function
的Google Chrome扩展程序。我检查的所有JavaScript模板库(mustachejs,underscorejs,jQuery模板,hoganjs等)都使用new Function
。有没有相当成熟和支持不使用它们?
答案 0 :(得分:5)
事实证明,mustachejs最近添加了new Function
并且使用tag 0.4.2没有它。它与Mustache.to_html
而不是Mustache.render
略有不同,可能会有一些性能降低。
我opened an issue可能会在将来的版本中删除new Function
。
答案 1 :(得分:3)
Pure似乎不使用eval
或new Function
。
答案 2 :(得分:3)
这里的答案已经过时,所以我发布了更新。
自9月以来,Google改变了他们的政策,并在清单2扩展中允许unsafe-eval
。请参阅this thread和this page。
如果为您的扩展启用了eval()
,则可以使用new Function()
,unsafe-eval
等库。
答案 3 :(得分:2)
Closure Templates是一个不使用eval
的模板库。模板会提前编译为JavaScript,因此应用程序中包含的内容是一个简单的.js文件,不应该遇到CSP问题。
答案 4 :(得分:2)
Distal模板不使用eval。
答案 5 :(得分:2)
这实际上取决于“模板库”的含义。如果你只是想要字符串插值,那么就不需要eval
或new Function
,当你开始需要嵌入式循环结构时,事情变得更加复杂。
几个月前,我写了一篇String.prototype.tmpl.js
script,我曾在这里和那里使用了几次,我不介意覆盖String.prototype
。作为静态函数,您可以使用:
function tmpl(tmpl, o) {
return tmpl.replace(/<%=(?:"([^"]*)"|(.*?))%>/g, function (item, qparam, param) {
return o[qparam] || o[param];
});
}
示例模板:
<div id="bar"></div>
<script type="text/x-tmpl" id="foo">
<h1><%=title%></h1>
<p><%=body%></p>
</script>
<script>
(function () {
var foo,
bar;
foo = document.getElementById('foo');
bar = document.getElementById('bar');
bar.innerHTML = tmpl(foo.innerHTML, {
title: 'foo bar baz',
body: 'lorem ipsum dolor sit amet'
});
}());
</script>
基本tmpl
脚本当然可以被修改以利用文档片段来实际构建DOM元素,但是我不确定它是否算作“模板库”。
答案 6 :(得分:1)
此问题的最佳解决方案是在部署扩展程序之前预先编译模板。 handlebarsjs和eco都提供预编译作为功能。我实际上写了一篇更深入的blog post。
答案 7 :(得分:0)
也许你可以写一个函数eval1:
function eval1(blah) {
var s = document.createElement("script");
s.src = blah;
document.head.appendChild(s);
document.head.removeChild(s);
}
并在您想要的库中进行查找/替换,但这是作弊,对吗?
答案 8 :(得分:0)
我最近遇到了同样的问题。更新清单版本后,我的扩展程序停止工作我尝试过Mustache但它无法呈现数组的索引和对象属性的名称。因此,我必须创建自己的简单但有效的模板库Ashe,它不含eval
和new Function
。希望它会帮助别人。
答案 9 :(得分:0)
https://developer.chrome.com/extensions/sandboxingEval
不确定何时添加,但您现在可以在Chrome中使用Firefox样式的沙盒。我正在移植我的Firefox扩展程序,所以我需要这个(因为我没有evalInSandbox:P)