感觉就像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
无法将字符串两次转义 - 换句话说,在<
更改为之后<
,它再也无法逃脱它<
.
那么发生了什么?起初,我认为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攻击,因此理解它的确切工作方式非常重要.以上只是猜测它是如何工作的.它可能实际上是一个不同的机制,是否有任何支持它的文档?
如您所见,在字符串上调用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.像任何东西一样,你在使用它时必须要小心