2010-09-02 15 views
27

Tôi có một số bản dịch trong ứng dụng Rails của tôi (config/locale/[en | de] .yml) và tôi sử dụng nó trong quan điểm của mình với <%=t "teasers.welcome" %>. Ví dụ:Sử dụng HTML bên trong tệp bản dịch Rails

teasers: 
    welcome: "<strong>Welcome</strong> to the Website ..." 

Trong Rails 2.3.8 này chỉ hoạt động tốt, với Rails 3, HTML đang trốn thoát và dịch sang &lt; ... Làm thế nào tôi có thể ngăn chặn hình thức này bản dịch này và sử dụng HTML trong file dịch của tôi như trong Rails 2.3.8?

Trả lời

36

Tôi cho rằng đó là bởi vì làm như

<%= t("blah") %> 

trong đường ray 2.x, bây giờ là tương đương với việc làm

<%=h t("blah") %> 

khi bạn đang sử dụng đường ray 3.

Từ release note s:

Chuyển đổi để XSS theo mặc định thoát cho đường ray.

Để sửa lỗi này, và một lần nữa từ các ghi chú phát hành:

Bạn không còn cần phải gọi h (string) để thoát ra HTML, đó là ngày bởi mặc định trong tất cả các quan điểm mẫu . Nếu bạn muốn chuỗi không thoát, hãy gọi nguyên (chuỗi).

Vì vậy, chỉ cần thay thế

<%= t("blah") %> 

bởi

<%= raw t("blah") %> 
+0

Cảm ơn rất nhiều cho câu trả lời này! – Fu86

+11

Cách quy ước là sử dụng các phím kết thúc bằng '_html'. –

+1

Hãy cẩn thận nếu bạn thêm dữ liệu động vào các bản dịch như sử dụng '<% = raw t" welcome ", tên: user.name%>'. Nếu người dùng đặt giá trị 'name' thành một số javascript, bạn đang có một cuộc tấn công XSS. – Yoko

70

khác vì sử dụng raw, có một cách không có giấy tờ (nhưng chính thức) khác để làm như vậy. Tất cả các phím kết thúc bằng _html được tự động hiển thị không thoát.

Đổi tên chìa khóa từ

teasers: 
    welcome: "<strong>Welcome</strong> to the Website ..." 

để

teasers: 
    welcome_html: "<strong>Welcome</strong> to the Website ..." 
+0

tuyệt, tôi không biết về điều này! – marcgg

+7

Thực ra nó được ghi lại, có tại đây http://guides.rubyonrails.org/i18n.html#using-safe-html-translations – ramontiveros

Các vấn đề liên quan