原始与html_safe与h到unescape html

假设我有以下string

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

在我看来,我想要显示一个链接。 也就是说,我不希望@x中的所有内容都被转义并显示为一个string。 有什么区别使用

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

考虑到Rails 3:

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

h只能从控制器或视图中使用,因为它来自助手。 这将迫使输出逃脱。 这不是真的废弃,但你很可能不会再使用它:唯一的用法是“恢复”一个html_safe声明,很不寻常。

raw加上你的expression式实际上相当于调用to_s链接上的html_safe ,但是在helper上声明,就像h一样,所以它只能用在控制器和视图上。

“ SafeBuffers和Rails 3.0 ”是SafeBufferhtml_safe魔术类)如何工作的一个很好的解释。

我认为这是重复的: html_safe不HTML转义您的string。 事实上,它会阻止你的string被转义。

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

会把:

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

到你的HTML源代码(耶,太安全了!),而:

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

会popup警告对话框(你确定这是你想要的?)。 所以你可能不想在任何用户input的string上调用html_safe

区别在于Rails的html_safe()raw() 。 耶胡达·卡茨(Yehuda Katz)在这方面有一个出色的post,这真的归结为:

 def raw(stringish) stringish.to_s.html_safe end 

是的, raw()html_safe()一个包装器,强制input为String,然后调用html_safe()raw()是模块中的helper也是这样,而html_safe()是String类中的一个方法,它创build了一个新的ActiveSupport :: SafeBuffer实例 – 它有一个@dirty标志。

参考“ Rails的html_safe与原始 ”。

  1. html_safe

    将string标记为可信任的安全。 它将被插入到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如果有机会,string将是nil

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

    用于转义HTML标记字符的实用方法。 使用此方法来转义任何不安全的内容。

    在Rails 3及以上版本中默认使用它,所以你不需要明确地使用这个方法

在简单的Rails的条款:

h将html标签移入数字字符,以便渲染不会破坏您的html

html_safe在string中设置一个布尔值,这样string被认为是html保存

raw它转换为html_safestring

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

这将避免XSS!