Supposons que j'ai la chaîne suivante
@x = "<a href='#'>Turn me into a link</a>"
À mon avis, je veux qu'un lien soit affiché. Autrement dit, je ne veux pas que tout dans @x soit échappé et affiché sous forme de chaîne. Quelle est la différence entre l'utilisation
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
ruby-on-rails
erb
grautur
la source
la source
<%== @x %>
un alias à<%= raw(@x) %>
edgeguides.rubyonrails.org/…Réponses:
Considérant Rails 3:
html_safe
en fait "définit la chaîne" comme HTML Safe (c'est un peu plus compliqué que ça, mais c'est fondamentalement ça). De cette façon, vous pouvez renvoyer des chaînes HTML Safe à partir d'aides ou de modèles à volonté.h
ne peut être utilisé qu'à partir d'un contrôleur ou d'une vue, car il provient d'un assistant. Cela forcera la sortie à s'échapper. Ce n'est pas vraiment obsolète, mais vous ne l'utiliserez probablement plus: le seul usage est de "revenir" à unehtml_safe
déclaration, ce qui est assez inhabituel.Ajouter votre expression avec
raw
équivaut en fait à appelerto_s
chaîné avechtml_safe
, mais est déclaré sur un assistant, tout commeh
, il ne peut donc être utilisé que sur les contrôleurs et les vues." SafeBuffers and Rails 3.0 " est une belle explication sur le fonctionnement du
SafeBuffer
s (la classe qui fait lahtml_safe
magie).la source
h
sera déprécié. L'utilisation"Hi<br/>#{h@ user.name}".html_safe
est assez courante et une utilisation acceptée.raw
ethtml_safe
dans la pratique:raw(nil)
renvoie une chaîne vide, tout ennil.html_safe
lançant une exception.h
ne "rétablira" pas une déclaration html_safe. Lorsqu'une chaîne esthtml_safe
,h
ne fera rien.Je pense que cela mérite d'être répété:
html_safe
n'échappe pas à votre chaîne HTML. En fait, cela empêchera votre chaîne de s'échapper.va mettre:
dans votre source HTML (oui, si sûr!), tout en:
fera apparaître la boîte de dialogue d'alerte (êtes-vous sûr que c'est ce que vous voulez?). Donc, vous ne voulez probablement pas appeler
html_safe
de chaînes saisies par l'utilisateur.la source
html_safe
ne pas échapper ni unescape. Bien que le résultat final du marquage de quelque chose comme non sûr pour HTML, puis de l'utilisation de l'échappement implicite de la balise ERB <% =, puisse être le même que l'échappement des données et leur rééchappement en sortie, fonctionnellement, il ne fait ni l'un ni l'autre. Un peu comme la différence de (6 * -1 * -1), contre 6.La différence est entre Rails
html_safe()
etraw()
. Il y a un excellent article de Yehuda Katz à ce sujet, et cela se résume vraiment à ceci:Oui,
raw()
est un wrapperhtml_safe()
qui force l'entrée à String et l'appelle ensuitehtml_safe()
. C'est également le cas quiraw()
est un assistant dans un module tandishtml_safe()
qu'une méthode sur la classe String crée une nouvelle instance ActiveSupport :: SafeBuffer - qui a un@dirty
indicateur.Reportez-vous à " Rails 'html_safe vs. raw ".
la source
html_safe
:Marque une chaîne comme sécurisée de confiance. Il sera inséré dans HTML sans aucun échappement supplémentaire effectué.
raw
:raw
est juste un emballage autourhtml_safe
. À utiliserraw
s'il y a des chances que la chaîne le soitnil
.h
alias pourhtml_escape
:Une méthode utilitaire pour échapper les caractères de balise HTML. Utilisez cette méthode pour échapper à tout contenu dangereux.
Dans Rails 3 et supérieur, il est utilisé par défaut, vous n'avez donc pas besoin d'utiliser cette méthode explicitement
la source
Le meilleur moyen sûr est:
<%= sanitize @x %>
Cela évitera XSS!
la source
En termes de Rails simples:
h
supprimer les balises html en caractères numériques afin que le rendu ne casse pas votre htmlhtml_safe
définit un booléen dans la chaîne afin que la chaîne soit considérée comme une sauvegarde htmlraw
Il convertit en html_safe en chaînela source
h
ishtml_safe
, ce qui signifie que le code HTML est rendu tel quel.