web-dev-qa-db-fra.com

raw vs html_safe vs h pour unescape html

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 %>

?

315
grautur

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 SafeBuffers (la classe qui exécute le html_safe magique).

382
Fábio Batista

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:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

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.

109
roasm

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 ".

46
Pankhuri
  1. 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
    _
  2. 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)
    #=> ""
    _
  3. 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.

27
Deepak Mahakale

Le meilleur moyen sûr est: <%= sanitize @x %>

Cela évitera le XSS!

11
Guilherme Y. Hatano

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

1
user3118220