提问



假设我有以下字符串


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


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


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


?

最佳参考


考虑Rails 3:


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


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


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


SafeBuffers和Rails 3.0很好地解释了SafeBuffer s(执行html_safe魔法的类)是如何工作的。 [40]

其它参考1


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


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与raw。[41]

其它参考3



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


其它参考4


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


它会避免XSS!

其它参考5


在Simple Rails术语中:


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


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


raw它将html_safe转换为字符串