原始与html_safe与h到unescape html
假设我有以下string
@x = "<a href='#'>Turn me into a link</a>"
在我看来,我想要显示一个链接。 也就是说,我不希望@x中的所有内容都被转义并显示为一个string。 有什么区别使用
<%= raw @x %> <%= h @x %> <%= @x.html_safe %>
?
考虑到Rails 3:
html_safe
实际上“设置string”为HTML安全(这比这更复杂一点,但基本上是这样)。 这样,您可以随意从助手或模型返回HTML安全string。
h
只能从控制器或视图中使用,因为它来自助手。 这将迫使输出逃脱。 这不是真的废弃,但你很可能不会再使用它:唯一的用法是“恢复”一个html_safe
声明,很不寻常。
用raw
加上你的expression式实际上相当于调用to_s
链接上的html_safe
,但是在helper上声明,就像h
一样,所以它只能用在控制器和视图上。
“ SafeBuffers和Rails 3.0 ”是SafeBuffer
( html_safe
魔术类)如何工作的一个很好的解释。
我认为这是重复的: html_safe
不HTML转义您的string。 事实上,它会阻止你的string被转义。
<%= "<script>alert('Hello!')</script>" %>
会把:
<script>alert('Hello!')</script>
到你的HTML源代码(耶,太安全了!),而:
<%= "<script>alert('Hello!')</script>".html_safe %>
会popup警告对话框(你确定这是你想要的?)。 所以你可能不想在任何用户input的string上调用html_safe
。
区别在于Rails的html_safe()
和raw()
。 耶胡达·卡茨(Yehuda Katz)在这方面有一个出色的post,这真的归结为:
def raw(stringish) stringish.to_s.html_safe end
是的, raw()
是html_safe()
一个包装器,强制input为String,然后调用html_safe()
。 raw()
是模块中的helper也是这样,而html_safe()
是String类中的一个方法,它创build了一个新的ActiveSupport :: SafeBuffer实例 – 它有一个@dirty
标志。
参考“ Rails的html_safe与原始 ”。
-
html_safe
:将string标记为可信任的安全。 它将被插入到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
如果有机会,string将是nil
。raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
-
h
别名为html_escape
:用于转义HTML标记字符的实用方法。 使用此方法来转义任何不安全的内容。
在Rails 3及以上版本中默认使用它,所以你不需要明确地使用这个方法
在简单的Rails的条款:
h
将html标签移入数字字符,以便渲染不会破坏您的html
html_safe
在string中设置一个布尔值,这样string被认为是html保存
raw
它转换为html_safestring
最安全的方法是: <%= sanitize @x %>
这将避免XSS!