2008-11-17 8 views

Répondre

89

évasion html. C'est une méthode qui convertit des choses comme < et> en références de caractères numériques afin que le rendu ne brise pas votre code HTML.

+12

et dans Rails 3 ceci est fait automatiquement par conséquent ne sera pas nécessaire. – lulalala

+1

@lulalala pouvez-vous fournir un lien pour sauvegarder votre affirmation que cela se fait automatiquement dans les rails 3 (et 4)? – bfcoder

+1

@bfcoder, ceci est dans tous les guides et documents Rails actuels. Toute chaîne qui n'est pas dans une instance SafeBuffer sera html échappée dans une vue, bien que vous puissiez toujours appeler d'autres méthodes d'échappement (comme json, etc) si vous en avez besoin. Je pense que cette explication est raisonnablement complète: http://makandracards.com/makandra/2579-tout-que-vous-connaissez-environ-html_safe-is-wrong – JasonTrue

14

<%=h est en fait 2 choses qui se passent. Vous ouvrez une balise erb (<%=) et appelez la méthode Rails h pour échapper tous les symboles.

Ces deux appels sont équivalentes:

<%=h person.first_name %> 
<%= h(person.first_name) %> 

La méthode h est couramment utilisé pour échapper à HTML et Javascript de formes d'entrée utilisateur.

+0

J'obtiens la partie <% = mais pourquoi exactement le h() est nécessaire dans cette instance ... Je sais que la méthode h est utilisée pour échapper le HTML et le Javascript des formulaires d'entrée de l'utilisateur mais 1) Tu ne peux pas dire <% = personne.first_name%>? Si non, pourquoi pas ... c'est-à-dire, quel problème spécifique est la résolution de h()? c'est-à-dire, qu'obtiendriez-vous si vous n'appeliez pas la méthode h()? – user2101068

12

h est un alias de méthode pour html_escape de la classe ERB::Util.

6

Il y a aussi une méthode en rack pour échapper HTML Rack::Utils.escape_html au cas où vous êtes en métal et que vous voulez échapper à un certain HTML.

1

Très en retard à la fête mais j'ajoute une explication supplémentaire à ce que html_escape fait pour aider d'autres noobs comme moi à comprendre ce qui se passe. Rails 3 et versions ultérieures échappent automatiquement à toutes les sorties maintenant et il y a donc beaucoup moins de situations où html_escape aka h() sera nécessaire. Dont le plus notable est quand vous avez l'intention d'utiliser la méthode html_safe lors de la construction des liens avec html dans une etc classe présentateur Par exemple:

#some_view.html.erb 
<span><%= @user.name %></span> #This is 100% fine and will be automatically escaped by Rails 3+ 
#Output => <span>Brian Kunzig</span> 

#Now say we want a link with html that we need preserved! OMG WHAT ARE DO?? 
<%=link_to "<span><i class='fa fa-user'></i>#{@user.name}</span>".html_safe #DANGER!!! 

Le lien ci-dessus peut causer des problèmes graves et vous ouvrir à toutes sortes de xss (attaques par script intersite). L'exemple le plus simple, si un utilisateur a sauvé leur nom "<script>alert('omg');</script>" et vous avez utilisé html_safe dessus, il provoquera une page de rendu leur nom censé obtenir une alerte disant « omg »! Ceci est un problème majeur. Pour éviter cela, faites:

<%=link_to "<span><i class='fa fa-user'></i>#{h(@user.name)}</span>".html_safe #Winning! 

En échappant aux données potentiellement contaminées fournies par un utilisateur, nous sommes sans domicile!

0

h est alias juste pour html_escape. C'est une méthode utilitaire couramment utilisée pour échapper html et javascript à partir des formulaires de saisie utilisateur. Il convertit les caractères spéciaux en références de caractères numériques afin que le rendu ne brise pas votre code HTML.

Par exemple ayant

<%= h "<p>Hello World</p>" %> 

volonté sortie

<p>Hello World</p> 

sous forme de texte pour voir paragraphe ne seront pas appliquées. il sera codé comme

&lt;p&gt;Hello World&lt;/p&gt;. 
Questions connexes