原始vs. html_safe与h来对html进行转义


323

假设我有以下字符串

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

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

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


由于没有人提到它,所以我想我也要提到那<%== @x %><%= raw(@x) %> edgeguides.rubyonrails.org/
CTS_AE

Answers:


386

考虑Rails 3:

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

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

在表达式之前加上前缀raw实际上等效于在其上to_s链接在一起的调用html_safe,但是在上被声明为helper,就像一样h,因此它只能在控制器和视图上使用。

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


42
我不会说那h将会被弃用。使用"Hi<br/>#{h@ user.name}".html_safe是很常见的,也是公认的用法。
maletor 2011年

1
@Maletor有趣的用法,尽管我仍然认为它属于“不寻常”类别。
法比奥·巴蒂斯塔

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

9
请注意,rawhtml_safe实践之间有一个细微的区别:raw(nil)返回一个空字符串,同时nil.html_safe引发异常。
范德霍恩

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

113

我认为它值得重复: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任何用户输入的字符串。


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

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

“ html_safe”的概念只是字符串上的一个元标记。标记为东西html_safe不会逃避,也没有 UNESCAPE。虽然标志着作为东西的最终结果不是 HTML安全,然后使用ERB <%=标签的隐含逃逸,可能是一样进行反向转义数据,然后再逃离它的输出,功能上它做的都不是。一种像的(6 * -1 * -1),与6的区别
奔Zittlau

46

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与raw ”。


30
  1. html_safe

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

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
  2. raw

    raw只是一个包装html_safe。使用raw,如果有机会,该字符串会nil

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. h的别名html_escape

    转义HTML标签字符的实用方法。使用此方法可以转义任何不安全的内容。

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



2

用Simple Rails术语:

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

html_safe 在字符串中设置一个布尔值,以便将该字符串视为html保存

raw 它将html_safe转换为字符串


hhtml_safe,这表示HTML照原样呈现。
戴夫牛顿

答案是正确的:h是html_escape ... 来自Rails代码库
notapatch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.