raw vs html_safe vs. h to unescape html

gra*_*tur 318 ruby-on-rails erb

假设我有以下字符串

@x = "<a href='#'>Turn me into a link</a>"
Run Code Online (Sandbox Code Playgroud)

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

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
Run Code Online (Sandbox Code Playgroud)

Fáb*_*sta 385

考虑Rails 3:

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

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

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

" SafeBuffers和Rails 3.0 "是一个很好的解释,是关于SafeBuffers(html_safe魔术的类)是如何工作的.

  • 我不会说`h`会被弃用.使用"你好#{h @ user.name}".html_safe`是很常见的并且是可接受的用法. (42认同)
  • 请注意,在实践中`raw`和`html_safe`之间存在细微差别:`raw(nil)`返回空字符串,而`nil.html_safe`抛出异常. (9认同)
  • 字符串#html_safe实际上返回一个ActiveSupport :: SafeBuffer的实例,它包装了原始字符串并且是#html_safe?.原始字符串不会变成#html_safe?在它上面调用#html_safe之后. (5认同)
  • `h`不会"恢复"html_safe声明.当一个字符串是`html_safe`时,`h`什么都不做. (2认同)

小智 109

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

<%= "<script>alert('Hello!')</script>" %>
Run Code Online (Sandbox Code Playgroud)

将放:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;
Run Code Online (Sandbox Code Playgroud)

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

<%= "<script>alert('Hello!')</script>".html_safe %>
Run Code Online (Sandbox Code Playgroud)

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

  • 换句话说,html_safe不是"请使这个html安全",它是相反的 - 你是程序员告诉rails"这个字符串是html安全的,保证!" (76认同)
  • 它确实应该在rails源代码中重命名为`.unescape_html`. (11认同)

小智 46

区别在于Rails html_safe()raw().耶胡达·卡茨(Yehuda Katz)就此发表了一篇很好的文章,它真的归结为:

def raw(stringish)

  stringish.to_s.html_safe

end
Run Code Online (Sandbox Code Playgroud)

是的,raw()是一个包装器html_safe(),强制输入到String然后调用html_safe()它.它也是raw()模块中的帮助器,而html_safe()String类上的方法是一个新的ActiveSupport :: SafeBuffer实例 - 它有一个@dirty标志.

请参阅"Rails'html_safe与raw ".


Dee*_*ale 29

  1. html_safe :

    将字符串标记为可信安全.它将被插入到HTML中,而不会执行其他转义.

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
    
    Run Code Online (Sandbox Code Playgroud)
  2. raw :

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

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
    Run Code Online (Sandbox Code Playgroud)
  3. h别名html_escape:

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

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


Gui*_*ano 13

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

它会避免XSS!