Pourquoi dans Rails 3, <%= note.html_safe %> et <%= h remarque.html_safe %> donner le même résultat?

Il se sent comme html_safe ajoute une abstraction de la classe String qui exige la compréhension de ce qui se passe, par exemple,

<%= '1 <b>2</b>' %>      # gives 1 &lt;b&gt;2&lt;/b&gt; 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 &lt;b&gt;2&lt;/b&gt;   wont' escape twice

Pour la ligne 4, si nous de dire, ok, nous faisons confiance à la chaîne -- c'est sûr, mais pourquoi ne pouvons-nous échapper? Il semble que, pour échapper par h, la chaîne doit être dangereux.

Donc sur la ligne 1, si la chaîne n'est pas échappé par h, il sera automatiquement échappé. Sur la ligne 5, h ne peut pas échapper à la chaîne à deux reprises: en d'autres termes, après < est changé à &lt;, il ne peut pas s'échapper une fois de plus à &amp;lt;.

Donc ce qui se passe? Au début, je pensais html_safe est juste le balisage d'un drapeau à la chaîne, en disant qu'il est sûr. Alors, pourquoi ne h pas y échapper? Il semble que h et html_escape réellement coopérer sur l'utilisation de l'indicateur:

1) Si une chaîne est html_safe, puis h ne va pas y échapper

2) Si une chaîne n'est pas html_safe, puis, quand la chaîne est ajoutée à la mémoire tampon de sortie, il sera automatiquement échappé par h.

3) Si h déjà échappé à une chaîne, il est marqué html_safe, et, par conséquent, de s'échapper une fois de plus par h ne prendra pas effet. (comme sur la Ligne 5, et que le comportement est le même, même dans les Rails 2.3.10, mais sur les Rails 2.3.5 h peut réellement échapper deux fois... donc dans les Rails 2.3.5, h est une simple méthode d'échappement, mais quelque part le long de la ligne de 2.3.10, h est devenue pas aussi simple. Mais 2.3.10 ne sera pas auto escape une chaîne de caractères, mais pour quelque raison, la méthode de html_safe existe déjà pour 2.3.10 (dans quel but?))

Est que la façon dont cela fonctionne exactement? Je pense que de nos jours, parfois nous n'obtenons pas ce que nous voulons dans la sortie et nous avons immédiatement ajouter html_safe de notre variable, qui peut être très dangereux, car il peut introduire attaque XSS de cette façon, afin de comprendre comment il fonctionne exactement peut être assez important. Le ci-dessus n'est qu'une supposition de la façon dont il exactement de travail. Pourrait-il être fait par un autre mécanisme, et quel est le doc qui la prend en charge?

OriginalL'auteur | 2010-11-01