2008-11-17 214 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;.