11

La versione 2 di Manifest dell'API di Chrome ha rimosso la possibilità di eseguire la valutazione non sicura. Ciò significa utilizzare la funzione eval o, in generale, creare dinamicamente una funzione dal testo.Modelli di Javascript Motori che funzionano con la politica di sicurezza dei contenuti di Chrome

Sembra che la maggior parte se non tutti i motori di modellazione Javascript lo facciano. Stavo usando Jaml, ma ne ho provati molti altri come backbone.js (che usa davvero il motore dei template di underscore.js) senza fortuna.

This comment on the Chromium project sembra indicare che ci sono molte librerie che ne soffrono.

Penso che Angular.js abbia una modalità CSP-safe, ma Angular.js è davvero troppo grande per quello di cui abbiamo bisogno. Abbiamo solo bisogno di un motore di template abbastanza semplice e non abbiamo bisogno di modelli o controller e così via. Qualcuno sa di motori di modellazione CSP-compatibilità là fuori?

+1

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

risposta

7

La soluzione migliore a questo problema è precompilare i modelli prima di distribuire l'estensione. Entrambi handlebarsjs e eco offrono la pre-compilazione come funzione. In realtà ho scritto uno blog post che va più in profondità.

+0

Grazie a questo sembra davvero promettente, basta guardarlo un po 'di più prima di approvare. –

+0

Google consente nuovamente la valutazione non sicura per manifest 2. Vedere http://stackoverflow.com/a/13335364/17815 –

3

Si consiglia di utilizzare la precompilazione come consigliato da Mathew per modelli di medie e grandi dimensioni. Per i modelli estremamente piccoli utilizziamo questo:

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

Questa implementazione non utilizza eval, ma richiederà il trattino di sottolineatura.

+0

Underscore utilizza internamente il costruttore 'Function' per compilare il modello, che è implicito' eval'. Vedi https://github.com/jashkenas/underscore/blob/91632707/underscore.js#L1192-L1232 –

+1

Questa implementazione non usa il metodo '_.template', che ha la dipendenza' eval' (altri metodi di sottolineatura sono bene). Lo stiamo utilizzando con una politica di sicurezza dei contenuti e funziona bene. –

+0

Scusa, ho frainteso la tua ultima osservazione. Ho erroneamente interpretato come "underscore's' _.template' non usa eval ". Hai assolutamente ragione: la tua implementazione proposta non usa 'eval'. –

Problemi correlati