假设我有下面的字符串
@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 %>
?
当前回答
我认为这值得重复:html_safe不会对字符串进行html转义。事实上,它会阻止字符串被转义。
<%= "<script>alert('Hello!')</script>" %>
将:
<script>alert('Hello!')</script>
到你的HTML源代码(耶,太安全了!),而:
<%= "<script>alert('Hello!')</script>".html_safe %>
将弹出警告对话框(你确定这是你想要的吗?)所以你可能不想对任何用户输入的字符串调用html_safe。
其他回答
简洁明了
让我们假设我们不能相信用户输入。
Bad:
User_input.html_safe #自找麻烦
好:
User_input.html_escape #
H (user_input) #在某个视图
我们控制的输入:
trusted_input_only.html_safe
应该没问题。但是要注意您的可信输入是什么。它们必须只能从你的应用程序中生成。
最安全的方法是:<%=消毒@x %>
它将避免XSS!
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
在简单Rails术语中:
H删除HTML标记为数字字符,这样渲染就不会破坏你的HTML
Html_safe在string中设置一个布尔值,以便将字符串视为HTML保存
它将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”。