【问题标题】:raw vs. html_safe vs. h to unescape htmlraw vs. html_safe vs. h 转义 html
【发布时间】:2011-05-14 04:05:56
【问题描述】:

假设我有以下字符串

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

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

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

?

【问题讨论】:

标签: ruby-on-rails erb


【解决方案1】:

考虑 Rails 3:

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

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

在你的表达式前面加上raw 实际上相当于调用to_shtml_safe 链接,但它是在帮助器上声明的,就像h 一样,所以它只能用于控制器和视图。

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

【讨论】:

  • 我不会说h 会被弃用。使用 "Hi&lt;br/&gt;#{h@ user.name}".html_safe 很常见,也可以接受。
  • @Maletor 有趣的用法,虽然我仍然认为它属于“不寻常”的类别。
  • String#html_safe 实际上返回一个 ActiveSupport::SafeBuffer 的实例,它包装了原始字符串并且是#html_safe? .原来的字符串不会变成#html_safe?在对它调用#html_safe 之后。
  • 请注意,rawhtml_safe 在实践中存在细微差别:raw(nil) 返回一个空字符串,而nil.html_safe 则抛出异常。
  • h 不会“还原” html_safe 声明。当字符串为html_safe 时,h 将不执行任何操作。
【解决方案2】:

我认为值得重复: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 %>

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

【讨论】:

  • 换句话说,html_safe 不是“请让这个 html 安全”,它恰恰相反——是你程序员告诉 rails“这个字符串是 html 安全的,保证!”
  • 其实我来这里是想弄清楚它是否真的有unescape,或者它只是做了一个没有必要to_escape的标记。很不一样。哦,好吧,那就去阅读源代码吧。
  • “html_safe”的概念只是字符串上的一个元标志。将某事标记为html_safe 不会 转义也不 unescape。虽然将某些内容标记为 not HTML 安全,然后使用 ERB
【解决方案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】:
    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 的包装。如果字符串有可能是nil,请使用raw

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

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

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

    【讨论】:

    • 最直接的解释IMO
    【解决方案5】:

    最好的安全方式是:&lt;%= sanitize @x %&gt;

    它将避免 XSS!

    【讨论】:

      【解决方案6】:

      在简单的 Rails 术语中:

      h 将 html 标签删除为数字字符,这样渲染就不会破坏您的 html

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

      raw它转换为html_safe到字符串

      【讨论】:

      • hhtml_safe,这意味着 HTML 按原样呈现。
      • 答案是正确的:h是html_escape ...from the Rails code base
      【解决方案7】:

      简短而简单

      假设我们不能信任用户输入。

      不好:

      user_input.html_safe # asking for trouble

      好:

      user_input.html_escape # or

      h(user_input) # in some view

      我们控制的输入:

      trusted_input_only.html_safe

      应该没问题。但要小心你信任的输入是什么。它们只能从您的应用中生成。

      【讨论】:

        猜你喜欢
        • 2011-07-07
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 2011-07-08
        • 2012-03-23
        • 2020-09-27
        • 1970-01-01
        相关资源
        最近更新 更多