“<%= h [...]%>”中“h”的含义是什么?

时间:2008-11-17 20:15:55

标签: ruby-on-rails ruby templates

当我生成默认脚手架时,show.html.erb上的显示标签有

<%=h @broker.name %>

我知道<%<%=之间的区别。什么是“h”?

6 个答案:

答案 0 :(得分:93)

html转义。这是一种转换像&lt;和&gt;到数字字符引用,这样渲染不会破坏你的HTML。

答案 1 :(得分:15)

<%=h实际上发生了两件事。您正在打开erb标记(<%=)并调用Rails方法h以转义所有符号。

这两个电话是等价的:

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

h方法通常用于从用户输入表单中转义HTML和Javascript。

答案 2 :(得分:13)

h是来自ERB::Util类的html_escape的方法别名。

答案 3 :(得分:6)

如果您在Metal中并想要转义某些HTML,那么Rack中还有一种方法可以转义HTML Rack::Utils.escape_html

答案 4 :(得分: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!

通过逃避用户提供的潜在污染数据,我们无家可归!

答案 5 :(得分:0)

h只是html_escape的别名。它是一种常用于从用户输入表单中转义html和javascript的实用方法。它将特殊字符转换为数字字符引用,以便渲染不会破坏您的HTML。

例如

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

将输出

<p>Hello World</p>

作为要查看的文本,段落将不适用。它将被编码为

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