当我生成一个默认的脚手架上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