11

Chrome API的清单版本2已删除了执行不安全评估的功能。这意味着使用eval函数或通常从文本动态创建函数。使用Chrome内容安全策略的Javascript模板引擎

它似乎像大多数,如果不是所有的Javascript模板引擎这样做。我使用的是Jaml,但我尝试了其他几个像backbone.js(真的使用underscore.js的模板引擎),但没有运气。

This comment on the Chromium project似乎表明,有很多图书馆都受到这个困扰。

我认为Angular.js具有CSP安全模式,但Angular.js对于我们所需要的实在太大了。我们只需要一个相当基本的模板引擎,不需要模型或控制器等。有谁知道任何CSP兼容性模板引擎吗?

+1

重复? http://stackoverflow.com/questions/10744764/javascript-template-library-that-doest-use-eval-new-function – apsillers 2012-07-16 13:31:29

回答

7

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

+0

感谢这看起来非常有前途,只需要在审批之前多加考虑一下。 – 2012-07-20 04:48:34

+0

Google已重新允许清单2的不安全评估。请参阅http://stackoverflow.com/a/13335364/17815 – 2012-11-11 20:56:29

3

您应该绝对使用Mathew推荐的中大模板预编译。对于极小的模板,我们使用的是:

var template = function(message, data) { 
    if (typeof data === 'undefined') { 
    return _.partial(template, message); 
    } else { 
    return message.replace(/\{\{([^}]+)}}/g, function(s, match) { 
     var result = data; 
     _.each(match.trim().split('.'), function(propertyName) { 
     result = result[propertyName] 
     }); 
     return _.escape(result); 
    }); 
    } 
}; 

var data = { 
    foo: 'Hello', 
    bar: { baz: 'world!' } 
}; 

// print on-the-fly 
template('{{foo}}, {{bar.baz}}' args); // -> 'Hello, world!' 

// prepare template to invoke later 
var pt = template('{{foo}}, {{bar.baz}}'); 
pt(args); // -> 'Hello, world!' 

此实现不使用eval,但它需要下划线。

+0

Underscore内部使用'Function'构造函数来编译模板,该模板隐含了'eval'。请参阅https://github.com/jashkenas/underscore/blob/91632707/underscore.js#L1192-L1232 – 2013-12-12 13:39:07

+1

此实现不使用'_.template'方法,该方法具有'eval'依赖性(其他下划线方法是精细)。我们正在使用它与内容安全策略并且很好地工作。 – 2013-12-12 16:23:25

+0

对不起,我误解了你最后的评论。我错误地将其解释为“下划线的'_.template'不使用eval”。你是完全正确的:你提出的实现不使用'eval'。 – 2013-12-12 16:25:22