首页 文章

raw vs html_safe vs. h to unescape html

提问于
浏览
305

假设我有以下字符串

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

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

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

6 回答

  • 107

    考虑Rails 3:

    html_safe 实际上"sets the string"作为HTML安全(它基本上是's a little more complicated than that, but it') . 这样,您可以随意从帮助程序或模型返回HTML安全字符串 .

    h 只能在控制器或视图中使用,因为它并没有真正弃用,但您很可能不会再使用它了:唯一的用法是"revert" html_safe 声明,非常不寻常 .

    使用 raw 预先设置表达式实际上等同于在其上调用 to_s 链接 html_safe ,但是在帮助器上声明,就像 h 一样,因此它只能在控制器和视图上使用 .

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

  • 375

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

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

    将放:

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

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

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

    将弹出警告对话框(你确定's what you want?). So you probably don't想要在任何用户输入的字符串上调用 html_safe .

  • 7

    区别在于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” .

  • 1
    • 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 的包装 . 如果字符串可能是 nil ,请使用 raw .

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

    html_escape

    • h 别名:

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

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

  • 23

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

    它会避免XSS!

  • 42

    在Simple Rails术语中:

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

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

    raw 它将html_safe转换为字符串

相关问题