假设我有以下字符串
@x = "<a href='#'>Turn me into a link</a>"
在我看来,我希望显示一个链接。也就是说,我不希望@x中的所有内容都被取消转义并显示为字符串。使用
之间有什么区别<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
答案 0 :(得分:381)
考虑Rails 3:
html_safe
实际上“将字符串”设置为HTML安全(它比这更复杂,但基本上就是这样)。这样,您可以随意从帮助程序或模型返回HTML安全字符串。
h
只能在控制器或视图中使用,因为它来自帮助程序。它将强制输出转义。它并没有真正被弃用,但你很可能不再使用它了:唯一的用法是“恢复”html_safe
声明,非常不寻常。
使用raw
添加表达式实际上等同于调用to_s
与html_safe
链接,但是在帮助器上声明,就像h
一样,因此它可以仅用于控制器和视图。
“SafeBuffers and Rails 3.0”是关于SafeBuffer
s(执行html_safe
魔法的类)如何工作的很好的解释。
答案 1 :(得分:108)
我认为值得重复:html_safe
不 HTML-escape你的字符串。实际上,它会阻止你的字符串被转义。
<%= "<script>alert('Hello!')</script>" %>
将提出:
<script>alert('Hello!')</script>
进入您的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)
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
的包装。如果字符串有可能是raw
,请使用nil
。
raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""
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转换为字符串