2012-11-22 13 views
11

używam Symfony2.1 i mają domyślny config.ymlSymfony2 HTML w trans gałązka filtr

Documentation said:

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

Ale jeśli mogę skopiować i wkleić go do mojego pustego szablonu (bez jakiekolwiek dodatkowe autoescapes lub inne) Otrzymałem ciąg znaków z nazwą użytkownika <h3>foo</h3>. Co robię źle?

+0

Mam dały odpowiedź, ale zastanawiałem się, dlaczego chcesz to zrobić w praktyce, jak gdybyś chciał zmienić znaczników wy mieliście trzeba zaktualizować wszystkie klucze tłumaczeń. Czy jest to uproszczony przykład i naprawdę wstrzyknąłeś html do tłumaczenia za pomocą symboli zastępczych wiadomości? – redbirdo

+0

Tak, to uproszczony przykład. W prawdziwym życiu chcę wprowadzić zmienną między tagami: '{{'Hello % var%' | trans ({'% var%': var})}}'. Teraz, aby to zrobić, muszę napisać: '{{'Hello % var%' | trans ({'% var%': var | e}) | raw}}' – Mikhail

Odpowiedz

14

Spróbuj z twig raw filter:

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

Jednakże, nie należy używać filtra raw jeśli przetwarza żadnych danych użytkownika! Pozwala na ataki typu "cross-site-scripting", according to the creators of Symfony. Zobacz this similar question dla bezpiecznej, ale bardziej żmudnej alternatywy.

+0

tak, działa. Tak więc dokumentacja jest niepoprawna, gdy mówisz 'ale ciągi statyczne nigdy nie są uciekane'. Ciągi statyczne również są usuwane. – Mikhail

+1

Hmm, użyłem html tylko w tłumaczeniach, w których używałem symboli zastępczych, w którym to przypadku łańcuch nie jest z definicji statyczny. Masz rację, że dokumentacja sugeruje, że ten przykład powinien działać bez surowca, w którym to przypadku jest to błąd, chyba że nie używasz najnowszej wersji Symfony i jest to ostatnia zmiana? – redbirdo

+1

A jeśli masz dane użytkowników wstrzyknięte w szablon Twig, możesz utworzyć lukę w zabezpieczeniach: http://blog.insight.sensiolabs.com/2013/11/28/a-new-batch-of-rules .html. Morał z tej historii: nie używaj "surowego"! –