Answers:
考虑Rails 3:
html_safe
实际上将“设置字符串”设置为HTML Safe(比这稍微复杂一点,但基本上是这样)。这样,您可以随意从助手或模型返回HTML安全字符串。
h
只能从控制器或视图中使用,因为它来自帮助器。它将迫使输出转义。它并不是真正不推荐使用的方法,但是您很可能不再使用它:唯一的用法是“还原” html_safe
声明,这很不寻常。
在表达式之前加上前缀raw
实际上等效于在其上to_s
链接在一起的调用html_safe
,但是在上被声明为helper,就像一样h
,因此它只能在控制器和视图上使用。
“ SafeBuffers and Rails 3.0 ”很好地解释了SafeBuffer
s(执行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_safe
没有没有 HTML-逃脱你的字符串。实际上,这将防止您的字符串被转义。
<%= "<script>alert('Hello!')</script>" %>
将放:
<script>alert('Hello!')</script>
进入您的HTML源代码(是的,很安全!),同时:
<%= "<script>alert('Hello!')</script>".html_safe %>
将弹出警报对话框(确定是您想要的吗?)。因此,您可能不想调用html_safe
任何用户输入的字符串。
html_safe
也不会逃避,也没有 UNESCAPE。虽然标志着作为东西的最终结果不是 HTML安全,然后使用ERB <%=标签的隐含逃逸,可能是一样进行反向转义数据,然后再逃离它的输出,功能上它做的都不是。一种像的(6 * -1 * -1),与6的区别
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与raw ”。
html_safe
:
将字符串标记为受信任的安全。它将被插入到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
,如果有机会,该字符串会nil
。
raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""
h
的别名html_escape
:
转义HTML标签字符的实用方法。使用此方法可以转义任何不安全的内容。
在Rails 3及更高版本中,默认情况下使用它,因此您无需显式使用此方法
最好的安全方法是: <%= sanitize @x %>
它将避免XSS!
用Simple Rails术语:
h
将html标签删除为数字字符,以便呈现不会破坏html
html_safe
在字符串中设置一个布尔值,以便将该字符串视为html保存
raw
它将html_safe转换为字符串
h
是html_safe
,这表示HTML照原样呈现。
<%== @x %>
是<%= raw(@x) %>
edgeguides.rubyonrails.org/