當我生成一個默認的腳手架上show.html.erb顯示標籤有「<%= h [...]%>」中的「h」是什麼意思?
<%=h @broker.name %>
我知道<%
和<%=
之間的差異。什麼是「h」呢?
當我生成一個默認的腳手架上show.html.erb顯示標籤有「<%= h [...]%>」中的「h」是什麼意思?
<%=h @broker.name %>
我知道<%
和<%=
之間的差異。什麼是「h」呢?
html escape。這是一種將<和>等內容轉換爲數字字符引用的方法,以便渲染不會破壞您的html。
<%=h
實際上是兩件事情發生。您打開erb標記(<%=
)並調用Rails方法h
來轉義所有符號。
這兩個調用是等效的:
<%=h person.first_name %>
<%= h(person.first_name) %>
的h
方法通常用於轉義從用戶輸入形式的HTML和Javascript。
h
是來自ERB::Util類的html_escape
的方法別名。
也有在機架的方法,以防逃跑HTML Rack::Utils.escape_html
你在金屬及想逃避一些HTML。
路遲到了,但我添加什麼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!
通過轉義用戶提供的潛在污染數據,我們是免費的!
h只是html_escape的別名。它是通常用於從用戶輸入表單中轉義html和javascript的實用方法。它將特殊字符轉換爲數字字符引用,以便渲染不會破壞您的html。
例如具有
<%= h "<p>Hello World</p>" %>
將輸出
<p>Hello World</p>
爲文本,以查看,段落將不會被應用。它將被編碼爲
<p>Hello World</p>.
而在Rails 3中,這是自動完成的,因此不需要。 – lulalala 2012-04-09 05:46:15
@lulalala你可以提供一個鏈接來備份你的聲明,這是在rails 3(和4)中自動完成的嗎? – bfcoder 2014-12-24 18:20:25