当前位置:  开发笔记 > 程序员 > 正文

为什么在Rails 3中,<%= note.html_safe%>和<%= h note.html_safe%>会得到相同的结果?

如何解决《为什么在Rails3中,<%=note.html_safe%>和<%=hnote.html_safe%>会得到相同的结果?》经验,为你挑选了1个好方法。

感觉就像html_safe在String类中添加一个抽象,需要了解正在发生的事情,例如,

<%= '1 2' %>      # gives 1 <b>2</b> in the HTML source code

<%= h '1 2' %>    # exactly the same as above

<%= '1 2'.html_safe %>      #  1 2  in HTML source code

<%= h '1 2'.html_safe %>    #  exactly the same as above

<%= h (h '1 2') %>  #  1 <b>2</b>   wont' escape twice

对于第4行,如果我们说,好的,我们相信字符串 - 它是安全的,但为什么我们不能逃脱呢?似乎要逃避它h,字符串必须是不安全的.

所以在第1行,如果字符串没有被转义h,它将自动转义.在第5行,h无法将字符串两次转义 - 换句话说,在<更改为之后<,它再也无法逃脱它&lt;.

那么发生了什么?起初,我认为html_safe只是标记字符串的标志,说它是安全的.那么,为什么不h逃避呢?似乎h并且html_escape实际上合作使用旗帜:

1)如果一个字符串是html_safe,那么h就不会逃避它

2)如果字符串不是html_safe,那么当字符串被添加到输出缓冲区时,它将被自动转义h.

3)如果h已经对字符串进行了转义,则会对其进行标记html_safe,因此,再次转义它h不会产生任何影响.(就像在第5行一样,即使在Rails 2.3.10中这种行为也是一样的,但是在Rails 2.3.5 h上实际上可以逃脱它两次......所以在Rails 2.3.5中,h是一个简单的转义方法,但是有些在哪里到2.3.10的那一行h变得不那么简单了.但是2.3.10不会自动转义字符串,但由于某种原因,该方法html_safe已经存在于2.3.10(出于什么目的?))

它是如何工作的?我想现在,有时我们在输出中没有得到我们想要的东西而且我们立即添加html_safe到变量中,这可能非常危险,因为它可以通过这种方式引入XSS攻击,因此理解它的确切工作方式非常重要.以上只是猜测它是如何工作的.它可能实际上是一个不同的机制,是否有任何支持它的文档?



1> Ben Hughes..:

如您所见,在字符串上调用html_safe会将其转换为html安全的SafeBuffer

http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L87

可能影响字符串安全的SafeBuffer上的任何操作都将通过h()传递

h使用此标志来避免双重转义

http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L18

行为确实发生了变化,我认为你对它的运作方式大多是正确的.一般情况下,除非您确定已经消毒,否则不应该调用html_safe.像任何东西一样,你在使用它时必须要小心

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有