Supposons que j'ai la chaîne suivante
@x = "<a href='#'>Turn me into a link</a>"
De mon point de vue, je souhaite qu'un lien soit affiché. C’est-à-dire que je ne veux pas que tout dans @ x soit non échappé et affiché sous forme de chaîne. Quelle est la différence entre utiliser
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
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é que depuis un contrôleur ou 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 en arrière" une déclaration html_safe
, assez inhabituelle.
Ajouter votre expression avec raw
équivaut en fait à appeler to_s
enchaîné avec html_safe
, mais il est déclaré dans une aide, comme h
, de sorte qu'il ne peut être utilisé sur les contrôleurs et les vues.
" SafeBuffers et Rails 3. " est une explication intéressante du fonctionnement de la SafeBuffer
s (la classe qui exécute le html_safe
magique).
Je pense qu'il vaut la peine de répéter: html_safe
fait pas HTML-échappe à votre chaîne. En fait, cela empêchera votre chaîne d'être échappée.
<%= "<script>alert('Hello!')</script>" %>
va mettre:
<script>alert('Hello!')</script>
dans votre source HTML (oui, donc en sécurité!), tandis que:
<%= "<script>alert('Hello!')</script>".html_safe %>
ouvrira 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
sur des chaînes entrées par l'utilisateur.
La différence se situe entre html_safe()
et raw()
de Rails. Yehuda Katz a publié un excellent article à ce sujet, qui se résume vraiment à ceci:
def raw(stringish)
stringish.to_s.html_safe
end
Oui, raw()
est un wrapper autour de html_safe()
qui force l'entrée à String, puis appelle html_safe()
. Il est également vrai que raw()
est un assistant dans un module, alors que html_safe()
est une méthode de la classe String qui crée une nouvelle instance ActiveSupport :: SafeBuffer - qui contient un indicateur @dirty
. .
Reportez-vous à " Rails’ html_safe vs. raw ".
html_safe
:
Marque une chaîne en tant que coffre sécurisé. Il sera inséré dans HTML sans échappement supplémentaire.
_"<a>Hello</a>".html_safe
#=> "<a>Hello</a>"
nil.html_safe
#=> NoMethodError: undefined method `html_safe' for nil:NilClass
_
raw
:
raw
est juste un wrapper autour de _html_safe
_. Utilisez raw
s'il y a des chances que la chaîne soit nil
.
_raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""
_
h
alias pour html_escape
:
Une méthode utilitaire pour échapper des caractères de balise HTML. Utilisez cette méthode pour échapper à tout contenu dangereux.
Dans Rails 3 et versions ultérieures, il est utilisé par défaut, vous n'avez donc pas besoin d'utiliser explicitement cette méthode.
Le meilleur moyen sûr est: <%= sanitize @x %>
Cela évitera le XSS!
En termes simples Rails:
h
supprime les balises html en chiffres afin que le rendu ne casse pas votre html
html_safe
définit un booléen dans une chaîne de sorte que la chaîne soit considérée comme une sauvegarde html
raw
Il convertit en html_safe en chaîne