10
votes

Évaluation par défaut à Freemarker

Dans les modèles de Freemarker, nous pouvons utiliser la directive Echapper pour appliquer automatiquement une évasion à toutes les interpolations à l'intérieur du bloc fourni: xxx

est un moyen d'obtenir de manière programmable un effet similaire, définissant une valeur par défaut Échappement appliqué à toutes les interpolations du modèle, y compris ces directives d'évacuation extérieures?

Merci.


0 commentaires

5 Réponses :


2
votes

Il y a une solution, bien que ce ne soit pas tout à fait trivial. Vous pouvez créer un templateloader spécial qui enveloppe d'autres chargeuses de modèle et injecte <#escape x sous X? HTML> dans le prologiciel du texte de la source de modèle et ajoute comme l'épilogue de celui-ci.

inconvénients évidents: - Les numéros de colonne en première ligne seront jetés - Si votre modèle commence par <#FTL> Déclaration, vous devez insérer <#escape> après.


0 commentaires

5
votes

Elaborer sur la réponse d'Attila: vous pouvez utiliser une classe comme Celui-ci puis enveloppez votre chargeur de modèle comme celui-ci:

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>");
  }
};


1 commentaires

Le lien de Peter à la classe d'enveloppeReader ne fonctionne plus. Le nouvel emplacement: SourceForge.net/p/metadata-net/code/head/tree/shared/trunk/u til / ...



1
votes

Vous n'avez pas vraiment besoin d'une création d'enveloppe pour ajouter les évasions. Vous pouvez simplement créer un décorateur autour de n'importe quel templateloader, lire dans le modèle dans une chaîne, envelopper le texte de modèle dans des échappements, puis renvoyer une stringreader qui lit la chaîne résultante. Pour voir comment cela est fait, jetez un look ici . Le seul gotcha que j'ai trouvé est que si vous utilisez cette approche et incluez les macros Spring.ftl de la classe de classe, ils vont exploser car ils ont une déclaration <#ftl> au sommet du Top. Vous pouvez toutefois simplement copier Spring.ftl dans votre chemin de modèle et supprimer la déclaration (et toutes les directives d'échappement depuis que vous vous échapperez par défaut).


0 commentaires

2
votes

Les templateloharlateurs suggérés dans les liens ont besoin d'un peu de peaufinage si vous utilisez pour inclure par exemple HTML dans vos modèles.

Aussi, vous devez copier Spring.ftl et Utilisez votre propre copie avec la directive sur le dessus supprimé comme Tom a dit. P>

Les opèrent bien, bien que le bit rugueux (en utilisant GUAVA sur Commons-io) P>

@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);  
   }  
} 


0 commentaires

4
votes

Depuis 2.3.24 Chaque modèle a un objet associé freemarker.core.outporformat , qui spécifie si et comment $ {...} (et # {...} ) est échappé. OuputFormat Pour HTML, XML et RTF sont fournis hors de la boîte, mais vous pouvez également définir vos propres formats. Lorsque la sortie SORTIFFORMAT s'échappe par défaut, vous pouvez empêcher de s'échapper explicitement comme $ {foo? No_esc} . .

Il existe plusieurs façons d'associer des modèles avec le sortieFormat souhaité. Pour les échappements HTML et XML, la manière recommandée est la réglage du paramètre reconnaissez_standard_file_extensions sur TRUE , puis en utilisant FTLH Extension de fichier pour HTML et FTLX Extension de fichier pour les modèles XML. Vous pouvez également associer SPORTFORMAT -S sur des modèles basés sur des motifs de nom de modèle arbitraire (Chemin de modèle), à ​​l'aide du paramètre template_configurers . Enfin notamment, vous pouvez simplement définir le format de sortie par défaut globalement comme configuration.setOutputformat (HTMLOutputPormat.Instance) . Vous pouvez également remplacer le format de sortie en haut du modèle en tant que <# ftl sortie_format = 'html'> , bien qu'il soit utilisé rarement.

Pages de documentation associées: http://freemarker.org/docs/dgui_misc_autogescaping.html , http://freemarker.org/docs/pgui_config_outputformatsautoeutoEsc.html


0 commentaires