2008-11-17 54 views

Trả lời

89

thoát html. Đó là một phương thức chuyển đổi những thứ như < và> thành các tham chiếu ký tự số để hiển thị sẽ không phá vỡ html của bạn.

+12

và trong Rails 3 điều này được thực hiện tự động do đó sẽ không cần thiết. – lulalala

+1

@lulalala bạn có thể cung cấp một liên kết để sao lưu khiếu nại của bạn rằng điều này được thực hiện tự động trong đường ray 3 (và 4)? – bfcoder

+1

@bfcoder, đây là tất cả các hướng dẫn và tài liệu của Rails hiện tại. Bất kỳ chuỗi nào không có trong một cá thể SafeBuffer sẽ được html thoát trong một khung nhìn, mặc dù bạn vẫn có thể gọi các phương thức thoát khác (như json, v.v.) nếu bạn cần chúng. Tôi nghĩ rằng giải thích này là hợp lý hoàn thành: http://makandracards.com/makandra/2579-everything-you-know-about-html_safe-is-wrong – JasonTrue

14

<%=h thực sự là 2 điều đang diễn ra. Bạn đang mở thẻ erb (<%=) và gọi phương thức Rails h để thoát khỏi tất cả các ký hiệu.

Hai gọi là tương đương:

<%=h person.first_name %> 
<%= h(person.first_name) %> 

Phương pháp h thường được sử dụng để thoát HTML và Javascript từ các hình thức sử dụng đầu vào.

+0

Tôi nhận được <% = một phần nhưng tại sao chính xác là h() cần thiết trong trường hợp này ... Tôi biết rằng phương pháp h được sử dụng để thoát HTML và Javascript từ các biểu mẫu người dùng nhập nhưng 1) Bạn không thể nói <% = person.first_name%>? Nếu không phải lý do tại sao không ... tức là, vấn đề cụ thể nào là giải quyết h()? tức là, bạn sẽ nhận được gì nếu bạn không gọi phương thức h(). – user2101068

12

h là bí danh phương thức cho html_escape từ lớp ERB::Util.

6

Ngoài ra còn có một phương pháp trong Rack để thoát HTML Rack::Utils.escape_html trong trường hợp bạn đang ở trong Metal và muốn thoát khỏi một số HTML.

1

Cách trễ bữa tiệc nhưng tôi đang thêm giải thích thêm về những gì html_escape đang làm để hy vọng giúp các noobs khác như bản thân tôi hiểu điều gì đang xảy ra. Rails 3 và sau đó tự động thoát khỏi tất cả các đầu ra ngay bây giờ và vì vậy có rất ít tình huống mà html_escape aka h() sẽ là cần thiết. Đáng chú ý nhất trong số đó là khi bạn có ý định sử dụng phương pháp html_safe khi xây dựng liên kết với html trong một lớp dẫn chương trình vv Ví dụ:

#some_view.html.erb 
<span><%= @user.name %></span> #This is 100% fine and will be automatically escaped by Rails 3+ 
#Output => <span>Brian Kunzig</span> 

#Now say we want a link with html that we need preserved! OMG WHAT ARE DO?? 
<%=link_to "<span><i class='fa fa-user'></i>#{@user.name}</span>".html_safe #DANGER!!! 

Liên kết ở trên có thể gây ra vấn đề nghiêm trọng và mở bạn đến tất cả các loại Tấn công xss (cross-site scripting). Ví dụ đơn giản nhất, nếu người dùng đã lưu tên của họ là "<script>alert('omg');</script>" và bạn đã sử dụng html_safe trên đó, nó sẽ khiến bất kỳ trang nào hiển thị tên giả định của họ để nhận được thông báo nói 'omg'! Đây là một vấn đề lớn. Để tránh điều này:

<%=link_to "<span><i class='fa fa-user'></i>#{h(@user.name)}</span>".html_safe #Winning! 

Bằng cách thoát dữ liệu có khả năng bị nhiễm do người dùng cung cấp, chúng tôi vô dụng!

0

h chỉ là bí danh cho html_escape. Nó là một phương pháp tiện ích thường được sử dụng để thoát khỏi html và javascript từ các hình thức đầu vào của người dùng. Nó chuyển đổi các charactes đặc biệt thành các tham chiếu ký tự số để hiển thị không phá vỡ html của bạn.

Ví dụ có

<%= h "<p>Hello World</p>" %> 

chí đầu ra

<p>Hello World</p> 

dưới dạng văn bản để xem, đoạn sẽ không được áp dụng. nó sẽ được mã hóa là

&lt;p&gt;Hello World&lt;/p&gt;. 
Các vấn đề liên quan