当我生成默认脚手架时,show.html.erb上的显示标签有
<%=h @broker.name %>
我知道<%
和<%=
之间的区别。什么是“h”?
答案 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>
作为要查看的文本,段落将不适用。它将被编码为
<p>Hello World</p>.