假设我有以下字符串
@x = "<a href='#'>Turn me into a link</a>"
在我看来,我想要显示一个链接 . 也就是说,我不希望@x中的所有内容都被取消转义并显示为字符串 . 使用之间有什么区别
<%= raw @x %> <%= h @x %> <%= @x.html_safe %>
?
考虑Rails 3:
html_safe 实际上"sets the string"作为HTML安全(它基本上是's a little more complicated than that, but it') . 这样,您可以随意从帮助程序或模型返回HTML安全字符串 .
html_safe
h 只能在控制器或视图中使用,因为它并没有真正弃用,但您很可能不会再使用它了:唯一的用法是"revert" html_safe 声明,非常不寻常 .
h
使用 raw 预先设置表达式实际上等同于在其上调用 to_s 链接 html_safe ,但是在帮助器上声明,就像 h 一样,因此它只能在控制器和视图上使用 .
raw
to_s
“SafeBuffers and Rails 3.0”是关于 SafeBuffer (执行 html_safe 魔法的类)如何工作的一个很好的解释 .
SafeBuffer
我认为值得重复: html_safe 确实 not HTML-escape你的字符串 . 实际上,它会阻止你的字符串被转义 .
<%= "<script>alert('Hello!')</script>" %>
将放:
<script>alert('Hello!')</script>
进入你的HTML源代码(耶,非常安全!),同时:
<%= "<script>alert('Hello!')</script>".html_safe %>
将弹出警告对话框(你确定's what you want?). So you probably don't想要在任何用户输入的字符串上调用 html_safe .
区别在于Rails' html_safe() 和 raw() 之间 . 耶胡达·卡茨(Yehuda Katz)就此发表了一篇很好的文章,它真的归结为:
html_safe()
raw()
def raw(stringish) stringish.to_s.html_safe end
是的, raw() 是 html_safe() 的包装器,它强制输入String,然后在其上调用 html_safe() . 这也是 raw() 是模块中的帮助器的情况,而 html_safe() 是String类上的一个方法,它创建一个新的ActiveSupport :: SafeBuffer实例 - 其中包含 @dirty 标志 .
@dirty
请参阅“Rails’ html_safe vs. raw” .
将字符串标记为可信安全 . 它将被插入到HTML中,而不会执行其他转义 .
"<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
raw 只是 html_safe 的包装 . 如果字符串可能是 nil ,请使用 raw .
nil
raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
html_escape 的
一种用于转义HTML标记字符的实用方法 . 使用此方法可以转义任何不安全的内容 .
在Rails 3及更高版本中,它默认使用,因此您不需要显式使用此方法
最安全的方法是: <%= sanitize @x %>
<%= sanitize @x %>
它会避免XSS!
在Simple Rails术语中:
h 将html标签移除到数字字符中,这样渲染就不会破坏你的html
html_safe 在字符串中设置一个布尔值,以便将该字符串视为html save
raw 它将html_safe转换为字符串
6 回答
考虑Rails 3:
html_safe
实际上"sets the string"作为HTML安全(它基本上是's a little more complicated than that, but it') . 这样,您可以随意从帮助程序或模型返回HTML安全字符串 .h
只能在控制器或视图中使用,因为它并没有真正弃用,但您很可能不会再使用它了:唯一的用法是"revert"html_safe
声明,非常不寻常 .使用
raw
预先设置表达式实际上等同于在其上调用to_s
链接html_safe
,但是在帮助器上声明,就像h
一样,因此它只能在控制器和视图上使用 .“SafeBuffers and Rails 3.0”是关于
SafeBuffer
(执行html_safe
魔法的类)如何工作的一个很好的解释 .我认为值得重复:
html_safe
确实 not HTML-escape你的字符串 . 实际上,它会阻止你的字符串被转义 .将放:
进入你的HTML源代码(耶,非常安全!),同时:
将弹出警告对话框(你确定's what you want?). So you probably don't想要在任何用户输入的字符串上调用
html_safe
.区别在于Rails'
html_safe()
和raw()
之间 . 耶胡达·卡茨(Yehuda Katz)就此发表了一篇很好的文章,它真的归结为:是的,
raw()
是html_safe()
的包装器,它强制输入String,然后在其上调用html_safe()
. 这也是raw()
是模块中的帮助器的情况,而html_safe()
是String类上的一个方法,它创建一个新的ActiveSupport :: SafeBuffer实例 - 其中包含@dirty
标志 .请参阅“Rails’ html_safe vs. raw” .
将字符串标记为可信安全 . 它将被插入到HTML中,而不会执行其他转义 .
raw
只是html_safe
的包装 . 如果字符串可能是nil
,请使用raw
.html_escape 的
一种用于转义HTML标记字符的实用方法 . 使用此方法可以转义任何不安全的内容 .
在Rails 3及更高版本中,它默认使用,因此您不需要显式使用此方法
最安全的方法是:
<%= sanitize @x %>
它会避免XSS!
在Simple Rails术语中:
h
将html标签移除到数字字符中,这样渲染就不会破坏你的htmlhtml_safe
在字符串中设置一个布尔值,以便将该字符串视为html saveraw
它将html_safe转换为字符串