假设我有以下字符串
@x = "Turn me into a link"
在我看来,我想要显示一个链接.也就是说,我不希望@x中的所有内容都被取消转义并显示为字符串.使用之间有什么区别
<%= raw @x %> <%= h @x %> <%= @x.html_safe %>
?
考虑Rails 3:
html_safe
实际上"设置字符串"为HTML安全(它比这更复杂,但它基本上是它).这样,您可以随意从帮助程序或模型返回HTML安全字符串.
h
只能在控制器或视图中使用,因为它来自帮助器.它将强制输出转义.它并没有真正被弃用,但你很可能不再使用它了:唯一的用法是"恢复"一个html_safe
声明,非常不寻常.
预先设置表达式raw
实际上等同于在其上调用to_s
chained html_safe
,但是在辅助函数上声明,就像h
它一样,因此它只能在控制器和视图上使用.
" SafeBuffers和Rails 3.0 "是一个很好的解释,是关于SafeBuffer
s(html_safe
魔术的类)是如何工作的.
我认为它值得重复:html_safe
没有没有 HTML转义的字符串.实际上,它会阻止你的字符串被转义.
<%= "" %>
将放:
<script>alert('Hello!')</script>
进入你的HTML源代码(耶,非常安全!),同时:
<%= "".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与raw ".
html_safe
:
将字符串标记为可信安全.它将被插入到HTML中,而不会执行其他转义.
"Hello".html_safe #=> "Hello" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
raw
:
raw
只是一个包装html_safe
.使用raw
,如果有机会,该字符串会nil
.
raw("Hello") #=> "Hello" raw(nil) #=> ""
h
别名html_escape
:
一种用于转义HTML标记字符的实用方法.使用此方法可以转义任何不安全的内容.
在Rails 3及更高版本中,它默认使用,因此您不需要显式使用此方法
最安全的方法是: <%= sanitize @x %>
它会避免XSS!