11

La versión 2 del Manifiesto de la API de Chrome ha eliminado la capacidad de realizar evaluaciones inseguras. Esto significa usar la función eval o, en general, crear dinámicamente una función a partir del texto.Motores de plantillas de Javascript que funcionan con la Política de seguridad de contenido de Chrome

Parece que la mayoría de los motores de plantillas de Javascript, si no todos, lo hacen. Estaba usando Jaml, pero probé varios otros como backbone.js (que realmente usa el motor de plantillas de underscore.js) sin suerte.

This comment on the Chromium project parece indicar que hay muchas bibliotecas que sufren esto.

Creo que Angular.js tiene un modo CSP-safe, pero Angular.js es realmente demasiado grande para lo que necesitamos. Solo necesitamos un motor de plantillas bastante básico y no necesitamos modelos o controladores, etc. ¿Alguien sabe acerca de cualquier motor de plantillas de compatibilidad CSP por ahí?

+1

¿Duplicado? http://stackoverflow.com/questions/10744764/javascript-template-library-that-doest-use-eval-new-function – apsillers

Respuesta

7

La mejor solución a este problema es precompilar sus plantillas antes de implementar su extensión. Tanto handlebarsjs como eco ofrecen precompilación como característica. De hecho, escribí un blog post que profundiza más.

+0

Gracias, esto parece realmente prometedor, solo hay que analizarlo un poco más antes de aprobarlo. –

+0

Google ya vuelve a permitir inseguro-eval para el manifiesto 2. Ver http://stackoverflow.com/a/13335364/17815 –

3

Debe utilizar la precompilación como recomienda Mateo para plantillas medianas y grandes. Para las plantillas muy pequeños estamos usando esto:

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!' 

Esta aplicación no utiliza eval, pero requerirá subrayado.

+0

Underscore utiliza internamente el constructor 'Function' para compilar la plantilla, que es' eval' implícita. Consulte https://github.com/jashkenas/underscore/blob/91632707/underscore.js#L1192-L1232 –

+1

Esta implementación no utiliza el método '_.template', que tiene la dependencia' eval' (otros métodos de subrayado son multa). Lo estamos usando con una Política de seguridad de contenido y funciona muy bien. –

+0

Disculpa, no entendí tu última observación. Lo interpreté erróneamente como "subrayado" _.template' no usa eval ". Tiene toda la razón: su implementación propuesta no usa 'eval'. –

Cuestiones relacionadas