提问人:grautur 提问时间:11/23/2010 最后编辑:Jamison Dancegrautur 更新时间:1/18/2022 访问量:308154
原始 vs.html_safe vs. h 取消转义 HTML
raw vs. html_safe vs. h to unescape html
问:
假设我有以下字符串
@x = "<a href='#'>Turn me into a link</a>"
在我看来,我希望显示一个链接。也就是说,我不希望 @x 中的所有内容都被取消转义并显示为字符串。使用有什么区别
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
答:
考虑 Rails 3:
html_safe
实际上“将字符串”设置为 HTML 安全(它比这复杂一点,但基本上就是这样)。这样,您可以随意从帮助程序或模型返回 HTML Safe 字符串。
h
只能在控制器或视图中使用,因为它来自帮助程序。它将强制对输出进行转义。它并没有真正被弃用,但你很可能不会再使用它了:唯一的用法是“还原”一个声明,这很不寻常。html_safe
在表达式前面加上 with 实际上等同于调用 chained with on 它,但是在帮助程序上声明的,就像 一样,所以它只能在控制器和视图上使用。raw
to_s
html_safe
h
"SafeBuffers and Rails 3.0“很好地解释了 s(施展魔法的类)是如何工作的。SafeBuffer
html_safe
评论
h
"Hi<br/>#{h@ user.name}".html_safe
raw
html_safe
raw(nil)
nil.html_safe
h
不会“还原”html_safe声明。当字符串为 时,将不执行任何操作。html_safe
h
我认为值得重复一遍:不会对你的字符串进行 HTML 转义。事实上,它会防止你的字符串被转义。html_safe
<%= "<script>alert('Hello!')</script>" %>
将把:
<script>alert('Hello!')</script>
添加到您的 HTML 源代码中(是的,非常安全!),同时:
<%= "<script>alert('Hello!')</script>".html_safe %>
将弹出警报对话框(您确定这是您想要的吗?因此,您可能不想调用任何用户输入的字符串。html_safe
评论
html_safe
区别在于 Rails 和 .耶胡达·卡茨(Yehuda Katz)对此发表了一篇出色的文章,它实际上归结为:html_safe()
raw()
def raw(stringish)
stringish.to_s.html_safe
end
是的,是一个包装器,强制输入到 String 然后调用它。这也是一个模块中的帮助程序,而它是 String 类上的一个方法,它创建一个新的 ActiveSupport::SafeBuffer 实例——其中有一个标志。raw()
html_safe()
html_safe()
raw()
html_safe()
@dirty
请参阅“Rails 的html_safe与.raw”。
用 Simple Rails 术语来说:
h
将 HTML 标记删除为数字字符,以便呈现不会破坏您的 HTML
html_safe
在字符串中设置布尔值,以便将该字符串视为 HTML 保存
raw
它将 html_safe 转换为字符串
评论
html_safe
:将字符串标记为受信任的安全字符串。它将入到 HTML 中,而不执行额外的转义。
"<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
生
:raw
只是一个包装器.如果字符串有可能为 .html_safe
raw
nil
raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
html_escape
的h
别名:用于转义 HTML 标记字符的实用工具方法。使用此方法可转义任何不安全的内容。
在 Rails 3 及更高版本中,默认使用它,因此您不需要显式使用此方法
最安全的方法是:<%= sanitize @x %>
它将避免 XSS!
短小精悍
假设我们不能信任用户输入。
坏:
user_input.html_safe # asking for trouble
好:
user_input.html_escape # or
h(user_input) # in some view
我们控制的输入:
trusted_input_only.html_safe
那应该没问题。但要小心你信任的输入是什么。它们只能从您的应用生成。
评论
<%== @x %>
<%= raw(@x) %>