#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!!!
7条答案
按热度按时间vbkedwbf1#
这是一种方法,它可以将诸如之类的内容转换< and >为数字字符引用,这样渲染就不会破坏你的html。
pvabu6sv2#
<%=h
实际上是两件事:打开一个erb标记(<%=
),调用Rails方法h
来转义所有符号。这两个调用是等效的:
h
方法通常用于从用户输入表单中转义HTML和Javascript。htrmnn0y3#
h
是ERB::Util类中html_escape
的方法别名。2exbekwf4#
Rack中还有一个方法可以转义HTML
Rack::Utils.escape_html
,以防您在Metal中想要转义一些HTML。rmbxnbpk5#
虽然已经很晚了,但我还是要对
html_escape
做进一步的解释,希望能帮助像我这样的新手理解发生了什么。Rails 3和更高版本现在会自动转义所有输出,所以需要html_escape
(又名h()
)的情况要少得多。其中最值得注意的是,当您打算使用html_safe
方法在presenter类等中构建带有html的链接时。例如:上面的链接可能会导致严重的问题,并使你面临各种xss(跨站点脚本)攻击。最简单的例子是,如果用户将其名称保存为
"<script>alert('omg');</script>"
,而你在其上使用了html_safe
,这将导致任何呈现其假定名称的页面收到一个警告“omg”!这是一个主要问题。要避免此问题,请执行以下操作:通过避开用户提供的潜在污染数据,我们就可以高枕无忧了!
jtjikinw6#
h只是html_escape的别名。它是一个实用的方法,通常用于从用户输入表单中转义html和javascript。它将特殊字符转换为数字字符引用,这样渲染就不会破坏你的html。
例如
意志输出
作为文本到查看,段落将不再被应用.它将被编码为
xytpbqjk7#
h
是html_safe
源代码的别名。......但是什么是html_safe呢?
警告
html_escape
不*使 * 某些东西安全,如果它本身就危险的话。它是做什么的?你告诉Rails:“不需要转义这个字符串--我知道我在做什么”。
不良:对此无保护:
user_input.html_safe # Danger!
永远不要将任何user_input标记为安全!
良好:
i_know_what_im_doing.html_safe