假设我有以下字符串

@x = "<a href='#'>Turn me into a link</a>"


在我看来,我想显示一个链接。也就是说,我不希望将@x中的所有内容都转义并显示为字符串。使用

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>


有什么区别?

评论

由于没有人提到它,所以我想我也要提到<%== @x%>这是<%= raw(@x)%> edgeguides.rubyonrails.org / ...的别名。

#1 楼

考虑到Rails 3:

html_safe实际上将“字符串设置”为HTML Safe(比这稍微复杂一点,但基本上就是它)。这样,您可以随意从助手或模型返回HTML安全字符串。

h只能在控制器或视图中使用,因为它来自助手。它将迫使输出转义。它并不是真的不推荐使用,但是您很可能不再使用它:唯一的用法是“还原”一个html_safe声明,这很不寻常。

在表达式中加上raw实际上等效于调用to_shtml_safe链接在一起,但是像h一样在辅助程序上声明,因此只能在控制器和视图上使用。

“ SafeBuffers and Rails 3.0”很好地解释了SafeBuffer s(执行html_safe魔术的类)工作。

评论


我不会说h会被弃用。使用“ Hi
#{h @ user.name}”。html_safe非常普遍,也是公认的用法。

– Maletor
2011年7月19日在23:21



@Maletor有趣的用法,尽管我仍然认为它属于“不寻常”类别。

–法比奥·巴蒂斯塔(FábioBatista)
2011年7月20日14:52

String#html_safe实际上返回ActiveSupport :: SafeBuffer的实例,该实例包装原始字符串,并且是#html_safe? 。原始字符串不会变成#html_safe?在调用#html_safe之后。

– jmaxyz
2012年4月13日15:57

请注意,实践中raw和html_safe之间有细微的差别:raw(nil)返回一个空字符串,而nil.html_safe引发异常。

–范德霍恩
13年8月12日在9:11

h不会“还原” html_safe声明。当字符串为html_safe时,h将不执行任何操作。

–GuiGS
2014年5月26日23:30

#2 楼

我认为这值得重复:html_safe不会HTML逸出您的字串。实际上,它可以防止您的字符串被转义。

<%= "<script>alert('Hello!')</script>" %>


将放置:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;


放入您的HTML源代码(是的,很安全!),而:

<%= "<script>alert('Hello!')</script>".html_safe %>


会弹出警报对话框(您确定这就是您想要的吗?)。因此,您可能不想在任何用户输入的字符串上调用html_safe

评论


换句话说,html_safe不是“请确保此html安全”,相反,它是程序员告诉Rails“此字符串对html安全,保证!”。

– PaulMurrayCbr
2014年1月10日下午4:50

实际上,我来这里是为了弄清它是否确实可以转义,或者是否只是标记出不必转义。完全不同。哦,好了,然后阅读源代码。

–西蒙B.
15年3月31日在12:15

“ html_safe”的概念只是字符串上的一个元标记。将某些内容标记为html_safe既不能转义也不能转义。虽然将某些内容标记为HTML不安全,然后使用ERB <%=标记的隐式转义的最终结果,可能与对数据进行转义然后在输出中重新转义的功能相同,从功能上讲,它们都没有这样做。有点像(6 * -1 * -1)与6。

– Ben Zittlau
19年8月22日在18:23

#3 楼

Rails的html_safe()raw()之间是有区别的。 Yehuda Katz对此发表了一篇很棒的文章,它的内容可以归结为:

def raw(stringish)

  stringish.to_s.html_safe

end


是的,raw()html_safe()的包装器,将输入强制为String然后在其上调用html_safe()。同样,raw()是模块中的帮助程序,而html_safe()是String类上的方法,该方法产生一个新的ActiveSupport :: SafeBuffer实例—其中带有@dirty标志。

请参阅“ Rails的html_safe vs. raw”。

#4 楼



html_safe

将字符串标记为受信任的安全。它将插入到HTML中,而不会执行其他转义。

"<a>Hello</a>".html_safe
#=> "<a>Hello</a>"

nil.html_safe
#=> NoMethodError: undefined method `html_safe' for nil:NilClass



raw

raw只是html_safe的包装。如果字符串可能是raw,请使用nil

raw("<a>Hello</a>")
#=> "<a>Hello</a>"

raw(nil)
#=> ""



h html_escape的别名:

一种实用程序方法用于转义HTML标记字符。使用此方法可以转义任何不安全的内容。

在Rails 3及更高版本中默认使用此方法,因此您无需显式使用此方法



#5 楼

最好的安全方法是:<%= sanitize @x %>

将避免使用XSS!

#6 楼

用Simple Rails术语:

h将html标签删除为数字字符,以便呈现不会破坏html

html_safe在字符串中设置布尔值,以便将该字符串视为html save

raw它将html_safe转换为字符串

评论


h是html_safe,这表示HTML照原样呈现。

–戴夫·牛顿
18年1月9日在22:24

答案是正确的:h是html_escape ...从Rails代码库

–notapatch
19-10-3在14:29