2009-08-12 10 views
10

में भागने Freemarker टेम्पलेट्स में हम बचाव निर्देश उपयोग कर सकते हैं स्वचालित रूप से शामिल ब्लॉक के अंदर सब छेड़छाड़ करने के लिए एक से बचने के लागू करने के लिए बाहर निकलने के निर्देशों सहित, टेम्पलेट में सभी इंटरपोलेशंस पर लागू भागने से बचें?डिफ़ॉल्ट Freemarker

धन्यवाद।

उत्तर

2

एक समाधान है, हालांकि यह पूरी तरह से तुच्छ नहीं है। आप एक विशेष टेम्पलेट लोडर बना सकते हैं जो अन्य टेम्पलेट लोडर को लपेटता है, और टेम्पलेट स्रोत टेक्स्ट के प्रस्ताव में < #escape x x? Html> इंजेक्ट करता है, और इसके उपन्यास के रूप में जोड़ता है।

स्पष्ट कमियां: - स्तंभ संख्या पहली पंक्ति में बंद फेंक दिया जाएगा - अगर आपकी टेम्पलेट के साथ < #ftl> घोषणा शुरू होता है, तो आप इसे बाद < #escape डालने के लिए> की जरूरत है।

5

अट्टिला के जवाब पर विस्तार से बता दें: यदि आप this one की तरह एक वर्ग का उपयोग और उसके बाद इस तरह अपने टेम्पलेट लोडर लपेट कर सकते हैं:

final TemplateLoader templateLoader = new ClassTemplateLoader(this.getClass(), templatePath) { 
    /** 
    * Replaces the normal template reader with something that changes the default 
    * escaping to HTML as to avoid XSS attacks. 
    */ 
    @Override 
    public Reader getReader(Object templateSource, String encoding) throws IOException { 
    return new WrappingReader(super.getReader(templateSource, encoding), "<#escape x as x?html>", "</#escape>"); 
    } 
}; 

आपके द्वारा जोड़े गए भागों में लाइनब्रेक नहीं लगाते हैं तो आप नहीं मिलता लाइन नंबरिंग समस्या। हालांकि, इस दृष्टिकोण के साथ आप < #ftl>/[# ftl] का उपयोग नहीं कर सकते हैं।

+0

पीटर लिंक अब और काम नहीं करता। नया स्थान: http://sourceforge.net/p/metadata-net/code/HEAD/tree/shared/trunk/util/src/main/java/au/edu/uq/itee/maenad/util/WrappingReader। जावा –

+0

@StefanHaberl: मैंने जवाब अपडेट किया - धन्यवाद। –

1

आपको एस्केप जोड़ने के लिए वास्तव में एक रैपिंग रीडर की आवश्यकता नहीं है। आप किसी भी टेम्पलेट लोडर के आस-पास एक सजावट बना सकते हैं, टेम्पलेट में स्ट्रिंग में पढ़ सकते हैं, टेम्पलेट टेक्स्ट को एस्केप में लपेट सकते हैं और फिर स्ट्रिंग रीडर को वापस कर सकते हैं जो परिणामी स्ट्रिंग को पढ़ता है। यह देखने के लिए कि यह कैसे किया गया है here देखें। मुझे मिला एकमात्र गोचा यह है कि यदि आप इस दृष्टिकोण का उपयोग करते हैं और क्लासपाथ से spring.ftl मैक्रोज़ को शामिल करते हैं तो वे बहुत ऊपर से < #ftl> घोषणा के बाद उड़ाएंगे। हालांकि आप बस अपने टेम्पलेट पथ में spring.ftl की प्रतिलिपि बना सकते हैं और घोषणा (और सभी भागने के निर्देशों को हटा सकते हैं क्योंकि आप डिफ़ॉल्ट रूप से भाग रहे होंगे)।

2

लिंक में सुझाव दिया TemplateLoaders अगर आप < # शामिल पार्स उपयोग कर रहे हैं = false ... /> अपने टेम्पलेट में उदाहरण HTML के लिए शामिल करने के लिए एक छोटे से फेरबदल की जरूरत है।

इसके अलावा, आपको spring.ftl की प्रतिलिपि बनाने और < #ftl के साथ अपनी प्रतिलिपि का उपयोग करने की आवश्यकता है ..> टॉम ने कहा कि शीर्ष पर निर्देश हटाएं।

निम्नलिखित अच्छी तरह से काम करता है, हालांकि (कॉमन्स-कब अमरूद का उपयोग करने पर) थोड़ा किसी न किसी

@Override 
public Reader getReader(Object pTemplateSource, String pEncoding) throws IOException { 
    Reader tReader = delegate.getReader(pTemplateSource, pEncoding); 
    try { 
     String tTemplateText = CharStreams.toString(tReader); 

     //only include files ending with "ftl", as we may have some parse=false on included html files 
     if (pTemplateSource.toString().endsWith("ftl")) { 
      return new StringReader(ESCAPE_PREFIX + tTemplateText + ESCAPE_SUFFIX); 
     } 
     return new StringReader(tTemplateText); 
    } finally { 
     Closeables.closeQuietly(tReader); 
    } 
} 
3

2.3.24 के बाद से प्रत्येक टेम्पलेट एक संबद्ध है freemarker.core.OutputFormat वस्तु है, जो निर्दिष्ट करती है और कैसे ${...} (और #{...}) बच निकला है एचटीएमएल, एक्सएमएल और आरटीएफ के लिए OuputFormat बॉक्स से बाहर प्रदान किए जाते हैं, लेकिन आप अपने प्रारूपों को भी परिभाषित कर सकते हैं। जब चयनित OutputFormat डिफ़ॉल्ट रूप से बच निकलता है, तो आप स्पष्ट रूप से ${foo?no_esc} से बचने से रोक सकते हैं।

OutputFormat के साथ टेम्पलेट्स को जोड़ने के कई तरीके हैं। HTML और XML से बचने के लिए, सुझाया गया तरीका true को recognize_standard_file_extensions कॉन्फ़िगरेशन सेटिंग स्थापित कर रही है, तो का उपयोग करके HTML के लिए ftlh फाइल एक्सटेंशन, और XML टेम्पलेट्स के लिए ftlx फाइल एक्सटेंशन।template_configurers सेटिंग का उपयोग करके आप मनमाने ढंग से टेम्पलेट नाम (टेम्पलेट पथ) पैटर्न के आधार पर OutputFormat -s टेम्पलेट्स को भी जोड़ सकते हैं। कम से कम नहीं, आप वैश्विक स्तर पर डिफ़ॉल्ट आउटपुट प्रारूप को configuration.setOutputFormat(HTMLOutputFormat.INSTANCE) जैसे सेट कर सकते हैं। आप टेम्पलेट के शीर्ष पर आउटपुट प्रारूप को <#ftl output_format='HTML'> के रूप में ओवरराइड भी कर सकते हैं, हालांकि इसे शायद ही कभी इस्तेमाल किया जाना चाहिए।

संबंधित ऐसे कई पृष्ठ: http://freemarker.org/docs/dgui_misc_autoescaping.html, WrappingReader वर्ग के लिए http://freemarker.org/docs/pgui_config_outputformatsautoesc.html

संबंधित मुद्दे