2012-11-22 5 views
11

utilizzare la Symfony2.1 e hanno il config.yml predefinitaSymfony2 HTML nella ramoscello trans filtro

Documentation said:

{# but static strings are never escaped #} 
    {{ '<h3>foo</h3>'|trans }} 

Ma se copiare e incollare nel mio modello vuoto (senza eventuali autoescapes aggiuntivi o altro) Ho ottenuto la stringa di escape <h3>foo</h3>. Cosa faccio di sbagliato?

+0

ho fornito una risposta, ma mi chiedevo perché si vuole fare questo in pratica come se si volesse cambiare il markup ti avevo è necessario aggiornare tutte le chiavi di traduzione. O si tratta di un esempio semplificato e stai davvero iniettando l'html nella traduzione usando i segnaposti dei messaggi? – redbirdo

+0

Sì, è un esempio semplificato. Nella vita reale voglio iniettare una variabile tra i tag: '{{'Hello % var%' | trans ({'% var%': var})}}'. Ora per fare questo devo scrivere: '{{'Ciao % var%' | trans ({'% var%': var | e}) | raw}}' – Mikhail

risposta

14

provare con la twig raw filter:

{{ '<h3>foo</h3>' | trans | raw }} 

Tuttavia, non utilizzare il filtro raw se si stanno elaborando alcun input da parte dell'utente! Permette attacchi cross-site-scripting, according to the creators of Symfony. Vedi this similar question per un'alternativa sicura ma più noiosa.

+0

sì, funziona. Quindi la documentazione è sbagliata quando si dice "ma le stringhe statiche non vengono mai sfuggite". Anche le stringhe statiche sono fuoriuscite. – Mikhail

+1

Hmm, ho usato solo html nelle traduzioni in cui ho usato segnaposti, nel qual caso la stringa è per definizione non statica. Hai ragione che la documentazione suggerisce che questo esempio dovrebbe funzionare senza raw, nel qual caso è un bug, a meno che tu non stia usando l'ultima versione di Symfony ed è un cambiamento recente? – redbirdo

+1

E se avessi iniettato alcuni dati utente nel modello Twig, avresti creato una vulnerabilità di sicurezza: http://blog.insight.sensiolabs.com/2013/11/28/a-new-batch-of-rules .html. Morale della trama: non usare 'raw'! –