11

के साथ काम करते हैं क्रोम एपीआई के मैनिफेस्ट संस्करण 2 ने असुरक्षित-eval करने की क्षमता को हटा दिया है। इसका मतलब है कि eval फ़ंक्शन का उपयोग करना या सामान्य रूप से पाठ से फ़ंक्शन बनाना।जावास्क्रिप्ट टेम्पलेट इंजन जो क्रोम की सामग्री सुरक्षा नीति

ऐसा लगता है कि सभी जावास्क्रिप्ट टेम्पलेटिंग इंजन ऐसा नहीं करते हैं। मैं जाम का उपयोग कर रहा था, लेकिन मैंने कई अन्य लोगों की कोशिश की जैसे backbone.js (जो वास्तव में underscore.js के templating इंजन का उपयोग करता है) कोई भाग्य नहीं है।

This comment on the Chromium project यह इंगित करता है कि इस से पीड़ित कई महान पुस्तकालय हैं।

मुझे लगता है कि Angular.js में एक सीएसपी-सुरक्षित मोड है, लेकिन Angular.js हमें जो चाहिए उसे वास्तव में बहुत बड़ा है। हमें बस एक काफी बुनियादी टेम्पलेटिंग इंजन की आवश्यकता है और मॉडल या नियंत्रकों की आवश्यकता नहीं है। क्या किसी को किसी भी सीएसपी-संगतता टेम्पलेटिंग इंजन के बारे में पता है?

+1

डुप्लिकेट? http://stackoverflow.com/questions/10744764/javascript-template-library-that-doest-use-eval- new-function – apsillers

उत्तर

7

इस समस्या का सबसे अच्छा समाधान आपके एक्सटेंशन को तैनात करने से पहले अपने टेम्पलेट को पूर्व-संकलित करना है। handlebarsjs और eco दोनों सुविधा के रूप में प्री-संकलन प्रदान करते हैं। मैंने वास्तव में blog post लिखा जो अधिक गहराई में जाता है।

+0

धन्यवाद यह वास्तव में आशाजनक दिखता है, अनुमोदन से पहले इसे थोड़ा और देखने की आवश्यकता है। –

+0

Google पहले से ही प्रकट 2 के लिए असुरक्षित-eval की अनुमति देता है। Http://stackoverflow.com/a/13335364/17815 –

3

आपको मध्यम और बड़े टेम्पलेट्स के लिए मैथ्यू द्वारा अनुशंसित प्रीकंपिलेशन का बिल्कुल उपयोग करना चाहिए। अत्यंत छोटे टेम्पलेट्स के लिए हम इस प्रयोग कर रहे हैं:

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

अंडरस्कोर टेम्पलेट को संकलित करने के लिए 'फ़ंक्शन' कन्स्ट्रक्टर का आंतरिक रूप से उपयोग करता है, जो कि 'eval' है। Https://github.com/jashkenas/underscore/blob/91632707/underscore.js#L1192-L1232 –

+1

यह कार्यान्वयन '_.template' विधि का उपयोग नहीं करता है, जिसमें' eval' निर्भरता है (अन्य अंडरस्कोर विधियां हैं ठीक)। हम इसे एक सामग्री-सुरक्षा-नीति के साथ उपयोग कर रहे हैं और अच्छी तरह से काम करता है। –

+0

क्षमा करें, मैंने आपकी आखिरी टिप्पणी को गलत समझा। मैंने गलती से इसका अर्थ "अंडरस्कोर '_.template' eval का उपयोग नहीं किया है"। आप बिल्कुल सही हैं: आपका प्रस्तावित कार्यान्वयन 'eval' का उपयोग नहीं करता है। –