假设我有下面的字符串
@x = "<a href='#'>Turn me into a link</a>"
在我的视图中,我希望显示一个链接。也就是说,我不希望@x中的所有内容都未转义并显示为字符串。使用有什么区别
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
假设我有下面的字符串
@x = "<a href='#'>Turn me into a link</a>"
在我的视图中,我希望显示一个链接。也就是说,我不希望@x中的所有内容都未转义并显示为字符串。使用有什么区别
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
当前回答
简洁明了
让我们假设我们不能相信用户输入。
Bad:
User_input.html_safe #自找麻烦
好:
User_input.html_escape #
H (user_input) #在某个视图
我们控制的输入:
trusted_input_only.html_safe
应该没问题。但是要注意您的可信输入是什么。它们必须只能从你的应用程序中生成。
其他回答
考虑Rails 3:
html_safe实际上“设置字符串”为HTML安全(它比这更复杂一点,但基本上就是这样)。通过这种方式,您可以随意从helper或模型返回HTML安全字符串。
H只能在控制器或视图中使用,因为它来自一个helper。它将强制输出转义。它并没有被弃用,但你很可能不会再使用它:唯一的用法是“恢复”html_safe声明,这很不寻常。
在你的表达式前加上raw实际上等同于调用带有html_safe的to_s链,但是在helper上声明,就像h一样,所以它只能在控制器和视图上使用。
“SafeBuffers and Rails 3.0”很好地解释了SafeBuffers(实现html_safe魔法的类)是如何工作的。
我认为这值得重复:html_safe不会对字符串进行html转义。事实上,它会阻止字符串被转义。
<%= "<script>alert('Hello!')</script>" %>
将:
<script>alert('Hello!')</script>
到你的HTML源代码(耶,太安全了!),而:
<%= "<script>alert('Hello!')</script>".html_safe %>
将弹出警告对话框(你确定这是你想要的吗?)所以你可能不想对任何用户输入的字符串调用html_safe。
区别在于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”。
html_safe : Marks a string as trusted safe. It will be inserted into HTML with no additional escaping performed. "<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass raw : raw is just a wrapper around html_safe. Use raw if there are chances that the string will be nil. raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> "" h alias for html_escape : A utility method for escaping HTML tag characters. Use this method to escape any unsafe content. In Rails 3 and above it is used by default so you don't need to use this method explicitly
简洁明了
让我们假设我们不能相信用户输入。
Bad:
User_input.html_safe #自找麻烦
好:
User_input.html_escape #
H (user_input) #在某个视图
我们控制的输入:
trusted_input_only.html_safe
应该没问题。但是要注意您的可信输入是什么。它们必须只能从你的应用程序中生成。