web-dev-qa-db-fra.com

Quelle est la signification de "h" dans "<% = h [...]%>"?

Lorsque je génère un échafaud par défaut, les balises d’affichage sur show.html.erb ont

<%=h @broker.name %>

Je connais la différence entre <% et <%=. Que fait le "h"?

60
neezer

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

92
JasonTrue

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

Ces deux appels sont équivalents:

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

La méthode h est couramment utilisée pour sortir HTML et Javascript des formulaires de saisie utilisateur.

15
Xac

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

13
Tim Harding

Il existe également une méthode dans Rack pour échapper à HTML Rack::Utils.escape_html si vous êtes dans Metal et souhaitez échapper à du HTML.

6
heycarsten

Bien trop tard pour la fête, mais j'ajoute une explication supplémentaire à ce que html_escape est en train de faire pour aider, espérons-le, d'autres noobs comme moi à comprendre ce qui se passe. Rails 3 et versions ultérieures échappent automatiquement à toutes les sorties maintenant. Il y a donc beaucoup moins de situations dans lesquelles html_escape, également appelé h(), sera nécessaire. Le plus notable est le moment où vous avez l'intention d'utiliser la méthode html_safe lors de la création de liens avec HTML dans une classe de présentateur, etc. 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 de graves problèmes et vous ouvrir à toutes sortes d'attaques xss (cross-site scripting). L'exemple le plus simple, si un utilisateur enregistrait son nom sous le nom "<script>alert('omg');</script>" et que vous utilisiez html_safe sur celui-ci, toutes les pages qui rendraient leur nom supposé recevraient 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 corrompues fournies par un utilisateur, nous sommes à la maison!

1
bkunzi01

h est juste un alias pour html_escape. Il s’agit d’une méthode utilitaire couramment utilisée pour échapper le code HTML et javascript 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 casse pas votre code HTML.

Par exemple avoir 

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

va sortir 

<p>Hello World</p>

comme texte à afficher, le paragraphe ne sera pas appliqué. il sera encodé comme 

&lt;p&gt;Hello World&lt;/p&gt;.
0
Nesha Zoric