raw vs html_safe vs. h to unescape html

时间:2010-11-22 23:27:26

标签: ruby-on-rails erb

假设我有以下字符串

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

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

之间有什么区别
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

6 个答案:

答案 0 :(得分:381)

考虑Rails 3:

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

h只能在控制器或视图中使用,因为它来自帮助程序。它将强制输出转义。它并没有真正被弃用,但你很可能不再使用它了:唯一的用法是“恢复”html_safe声明,非常不寻常。

使用raw添加表达式实际上等同于调用to_shtml_safe链接,但是在帮助器上声明,就像h一样,因此它可以仅用于控制器和视图。

SafeBuffers and Rails 3.0”是关于SafeBuffer s(执行html_safe魔法的类)如何工作的很好的解释。

答案 1 :(得分:108)

我认为值得重复:html_safe HTML-escape你的字符串。实际上,它会阻止你的字符串被转义。

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

将提出:

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

进入您的HTML源代码(是的,非常安全!),同时:

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

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

答案 2 :(得分:45)

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

答案 3 :(得分:26)

  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及更高版本中,默认使用它,因此您不需要明确使用此方法

答案 4 :(得分:9)

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

它会避免使用XSS!

答案 5 :(得分:1)

在Simple Rails术语中:

h将html标记移到数字字符中,这样渲染就不会破坏你的html

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

raw它将html_safe转换为字符串