2008-11-17 49 views

回答

89

html escape。這是一種將<和>等內容轉換爲數字字符引用的方法,以便渲染不會破壞您的html。

+12

而在Rails 3中,這是自動完成的,因此不需要。 – lulalala 2012-04-09 05:46:15

+1

@lulalala你可以提供一個鏈接來備份你的聲明,這是在rails 3(和4)中自動完成的嗎? – bfcoder 2014-12-24 18:20:25

14

<%=h實際上是兩件事情發生。您打開erb標記(<%=)並調用Rails方法h來轉義所有符號。

這兩個調用是等效的:

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

h方法通常用於轉義從用戶輸入形式的HTML和Javascript。

12

h是來自ERB::Util類的html_escape的方法別名。

6

也有在機架的方法,以防逃跑HTML Rack::Utils.escape_html你在金屬及想逃避一些HTML。

1

路遲到了,但我添加什麼html_escape正在做,希望能夠幫助其他菜鳥像我明白髮生了什麼進一步的解釋。 Rails 3及更高版本現在會自動轉義所有輸出,因此需要html_escape又名h()的情況要少得多。最顯着的,其中是當你打算建設有HTML鏈接時,在主持人類等。例如使用html_safe方法:

#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!!! 

上面的鏈接可能會導致嚴重的問題,打開你到各種各樣的xss(跨站腳本)攻擊。最簡單的例子是,如果用戶將他們的名字保存爲"<script>alert('omg');</script>",並且您使用了html_safe,則它會導致任何頁面呈現其假定的名稱,以發出「omg」的警報!這是一個主要問題。爲了避免這樣做:

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

通過轉義用戶提供的潛在污染數據,我們是免費的!

0

h只是html_escape的別名。它是通常用於從用戶輸入表單中轉義html和javascript的實用方法。它將特殊字符轉換爲數字字符引用,以便渲染不會破壞您的html。

例如具有

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

將輸出

<p>Hello World</p> 

爲文本,以查看,段落將不會被應用。它將被編碼爲

&lt;p&gt;Hello World&lt;/p&gt;.