感觉就像html_safe
在 String 类中添加了一个抽象,需要了解正在发生的事情,例如,
<%= '1 <b>2</b>' %> # gives 1 <b>2</b> in the HTML source code
<%= h '1 <b>2</b>' %> # exactly the same as above
<%= '1 <b>2</b>'.html_safe %> # 1 <b>2</b> in HTML source code
<%= h '1 <b>2</b>'.html_safe %> # exactly the same as above
<%= h (h '1 <b>2</b>') %> # 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.5h
上实际上可以转义两次......所以在 Rails 2.3.5 中,h
是一种简单的转义方法,但有些地方沿着到 2.3.10 的行h
变得不那么简单了。但是 2.3.10 不会自动转义字符串,但是由于某种原因,该方法html_safe
已经存在于 2.3.10(出于什么目的?))
它是这样工作的吗?我认为现在,有时我们在输出中没有得到我们想要的东西,我们立即添加html_safe
到我们的变量中,这可能非常危险,因为它会以这种方式引入 XSS 攻击,因此了解它的确切工作原理可能非常重要。以上只是对其具体工作方式的猜测。它实际上可能是一种不同的机制吗?是否有任何支持它的文档?