【发布时间】:2010-09-22 17:50:18
【问题描述】:
当我生成默认脚手架时,show.html.erb 上的显示标签有
<%=h @broker.name %>
我知道<% 和<%= 之间的区别。 “h”是做什么的?
【问题讨论】:
标签: ruby-on-rails ruby templates
当我生成默认脚手架时,show.html.erb 上的显示标签有
<%=h @broker.name %>
我知道<% 和<%= 之间的区别。 “h”是做什么的?
【问题讨论】:
标签: ruby-on-rails ruby templates
html 转义。这是一种将 之类的内容转换为数字字符引用的方法,这样渲染就不会破坏您的 html。
【讨论】:
<%=h 实际上发生了两件事。您正在打开一个 erb 标签 (<%=) 并调用 Rails 方法 h 来转义所有符号。
这两个调用是等价的:
<%=h person.first_name %>
<%= h(person.first_name) %>
h 方法通常用于从用户输入表单中转义 HTML 和 Javascript。
【讨论】:
h 是来自ERB::Util 类的html_escape 的方法别名。
【讨论】:
Rack 中还有一种方法可以转义 HTML Rack::Utils.escape_html,以防您在 Metal 中并想转义一些 HTML。
【讨论】:
派对迟到了,但我要进一步解释 html_escape 正在做什么,希望能帮助像我这样的其他菜鸟了解正在发生的事情。 Rails 3 和更高版本现在自动转义所有输出,因此需要html_escape aka 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>.
【讨论】: