2015-04-25 14 views
6

Ho un commento una chiamata ajax che restituisce i dati del commento postato, ho anche la funzionalità @mention integrata, il lato server sta elaborando le @mentions e sta facendo uno str_replace sugli utenti citati che sostituiscono i loro nomi con un tag all'interno della risposta, ad esempio:Stop nunjucks dall'esclusione di HTML

{ 
    data: { 
     comment: "<a href=\"profile/derp\">Username</a> hey what's up" 
    } 
} 

Tuttavia non riesco a trovare nella documentazione di come consentire nunjucks di stampare questo come vero e proprio HTML, sfugge e visualizza il codice, invece di lasciare che essere un vero tag.

Qualcuno sa come posso permettere che questo sia stampato come un vero e proprio tag?

Grazie

risposta

22

Ok, quindi quasi subito dopo che ho postato questo ho trovato la risposta! per chiunque altro guardi è semplicemente questo; all'interno del modello in cui stampi la tua variabile aggiungi il filtro sicuro, che disabiliterà l'escape automatico.

{{ comment.content|safe }} 

Anche se questo significa che è vulnerabile all'iniezione XSS, quindi assicuratevi di aggiungere la protezione sul lato server.

+0

Questo mi ha gettato perché quando ho visto inizialmente il filtro, ho pensato che fosse il * contrario * - che sarebbe sicuro che sfuggire HTML. – Scribblemacher

+0

mi hai salvato :) – Ali

2

Si potrebbe prendere in considerazione il passaggio metadati del commento e lasciare che il modello di creare il codice HTML:

<p><a href="{{ comment.user.url }}">{{ comment.user.name }}</a> {{ comment.text }}</p> 

E poi passare i meta-dati in questo modo:

comment: { 
    user: { url: "profile/derp", name: "Username" }, 
    text: "hey what's up" 
} 
+0

Grazie per il tuo suggerimento, ma il problema è che il modello non sa in anticipo se ci sarà un link, in quanto questo link viene aggiunto solo se ci sono menzioni, che possono essere all'interno di un commento per esempio. –

+0

@ AndréFigueira è possibile aggiungere un'istruzione condizionale. –

5

È anche possibile evitare la fuga a livello globale: nunjucks.configure({autoescape:false});

+2

Anche se non hai quasi mai voglia di farlo. – danneu