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 <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
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é à <
, il ne peut pas s'échapper une fois de plus à &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
Vous devez vous connecter pour publier un commentaire.
Comme vous pouvez le voir, l'appel de html_safe sur une chaîne, il devient un html sûr SafeBuffer
http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L87
Toutes les opérations sur un SafeBuffer qui pourraient affecter la chaîne de sécurité seront transmis par le biais de h()
h utilise cet indicateur pour éviter la double échappement
http://github.com/rails/rails/blob/89978f10afbad3f856e2959a811bed1982715408/activesupport/lib/active_support/core_ext/string/output_safety.rb#L18
Le comportement a changé et je pense que vous êtes la plupart du temps correct sur la façon dont il fonctionne. En général, vous ne devez pas appeler html_safe sauf si vous êtes sûr qu'il est déjà aseptisé. Comme toute chose, vous devez être prudent tout en utilisant le
"foobar".html_safe
va réellement créer et renvoyer une nouvelle instance de SafeBuffer avec le contenu de la chaîne d'origine...OriginalL'auteur Ben Hughes
dans rails 3, la sortie est à l'aide de la
h
helper par défautvoir http://origami.co.uk/blog/2010/02/rails-3-html-escaping
si vous ne voulez pas d'échapper vous pouvez utiliser
raw
OriginalL'auteur Nick Ginanto