13

谷歌浏览器扩展使用manifest_version: 2被限制使用evalnew Function。我检查的所有 JavaScript 模板库(mustachejs、underscorejs、jQuery 模板、hoganjs 等)都使用new Function. 有没有相当成熟和支持但不使用的?

有关安全限制的信息

4

10 回答 10

5

事实证明,mustachejsnew Function最近添加并使用标签 0.4.2没有它。它的 API 与Mustache.to_html而不是稍有不同,Mustache.render并且可能会降低一些性能。

打开了一个问题,可能会new Function在未来的版本中被删除。

于 2012-05-24T21:15:02.160 回答
3

Pure似乎没有使用evalnew Function

于 2012-05-24T20:30:44.737 回答
3

这里的答案已经过时,所以我发布了更新。

自 9 月以来,Google 更改了他们的政策并允许unsafe-eval在清单 2 中扩展。请参阅此线程此页面

因此,如果为您的扩展打开了,则可以使用 usingeval()等库new Function()unsafe-eval

于 2012-11-11T20:55:24.903 回答
2

Closure Templates是一个模板库,它不使用eval. 模板会提前编译为 JavaScript,因此您的应用程序中包含的内容是一个纯 .js 文件,不应遇到 CSP 问题。

于 2012-05-25T01:00:02.210 回答
2

这真的取决于你所说的“模板库”是什么意思。如果您只想要字符串插值,则不需要evalor new Function,当您开始需要嵌入式循环结构时,事情会变得更加复杂。

几个月前,我编写了一个String.prototype.tmpl.js脚本,在我不介意覆盖String.prototype. 作为静态函数,您可以使用:

tmpl.js:
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 元素,但我不确定它是否算作“模板库”。

于 2012-11-11T21:16:05.117 回答
2

远端模板不使用 eval。

于 2012-07-11T05:33:12.757 回答
1

此问题的最佳解决方案是在部署扩展之前预编译模板。handlebarsjseco都提供预编译功能。我实际上写了一篇更深入的博客文章。

于 2012-07-18T23:22:14.917 回答
0

https://developer.chrome.com/extensions/sandboxingEval

不确定何时添加,但您现在可以在 Chrome 中进行 Firefox 风格的沙盒。我正在移植我的 Firefox 扩展,所以我需要这个(因为我没有 evalInSandbox :P)

于 2014-04-02T02:10:48.223 回答
0

也许你可以写一个函数 eval1:

function eval1(blah) {
    var s = document.createElement("script");
    s.src = blah;
    document.head.appendChild(s);
    document.head.removeChild(s);
}

并在您想要的库中查找/替换,但那是作弊,对吧?

于 2012-05-28T04:32:41.910 回答
0

我最近遇到了同样的问题。更新清单版本后,我的扩展程序停止工作。我尝试了 Mustache,但它无法呈现数组的索引和对象属性的名称。所以我必须创建自己的简单但有效的模板库Ashe,它没有evalnew Function. 希望它会帮助某人。

于 2012-07-14T20:42:50.457 回答