2012-11-22 8 views
11

tôi sử dụng Symfony2.1 và có config.yml mặc địnhSymfony2 HTML trong cành lá xuyên lọc

Documentation said:

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

Nhưng nếu tôi sao chép và dán nó vào mẫu trống của tôi (mà không bất kỳ autoescapes bổ sung hoặc khác) Tôi có chuỗi thoát <h3>foo</h3>. Tôi đã làm gì sai?

+0

tôi đã cung cấp một câu trả lời nhưng tôi đã tự hỏi tại sao bạn lại muốn làm điều này trong thực tế như nếu bạn muốn thay đổi đánh dấu bạn muốn cần cập nhật tất cả các phím dịch của bạn. Hay đây là một ví dụ đơn giản và bạn đang thực sự tiêm html vào bản dịch bằng cách sử dụng trình giữ chỗ thông báo? – redbirdo

+0

Vâng, đó là một ví dụ đơn giản. Trong cuộc sống thực, tôi muốn tiêm một biến giữa các thẻ: '{{'Xin chào % var%' | trans ({'% var%': var})}}'. Bây giờ để làm điều này tôi phải viết: '{{'Xin chào % var%' | trans ({'% var%': var | e}) | raw}}' – Mikhail

Trả lời

14

Hãy thử nó với twig raw filter:

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

Tuy nhiên, không sử dụng bộ lọc raw nếu bạn đang xử lý bất kỳ đầu vào người sử dụng! Nó cho phép tấn công cross-site-scripting, according to the creators of Symfony. Xem this similar question để biết cách thay thế an toàn nhưng tẻ nhạt hơn.

+0

có, nó hoạt động. Vì vậy, tài liệu sai khi nói 'nhưng các chuỗi tĩnh không bao giờ được thoát '. Các chuỗi tĩnh cũng được thoát. – Mikhail

+1

Hmm, tôi đã chỉ sử dụng html trong bản dịch mà tôi đã sử dụng trình giữ chỗ trong trường hợp chuỗi này theo định nghĩa không tĩnh. Bạn nói đúng rằng tài liệu cho thấy ví dụ này sẽ hoạt động mà không có nguyên, trong trường hợp đó là một lỗi, trừ khi bạn không sử dụng phiên bản mới nhất của Symfony và đó là một thay đổi gần đây? – redbirdo

+1

Và nếu bạn đã nhập một số dữ liệu người dùng vào mẫu Twig, bạn đã tạo ra lỗ hổng bảo mật: http://blog.insight.sensiolabs.com/2013/11/28/a-new-batch-of-rules .html. Đạo đức của câu chuyện: không sử dụng 'nguyên'! –