Cuando genero un andamio por defecto, las etiquetas de visualización en show.html.erb tienen¿Cuál es el significado de "h" en "<% = h [...]%>"?
<%=h @broker.name %>
sé la diferencia entre <%
y <%=
. ¿Qué es la "h"?
Cuando genero un andamio por defecto, las etiquetas de visualización en show.html.erb tienen¿Cuál es el significado de "h" en "<% = h [...]%>"?
<%=h @broker.name %>
sé la diferencia entre <%
y <%=
. ¿Qué es la "h"?
html escape. Es un método que convierte cosas como < y> en referencias de caracteres numéricos para que la representación no rompa su html.
<%=h
en realidad están pasando 2 cosas. Está abriendo una etiqueta erb (<%=
) y llamando al método Rails h
para escapar de todos los símbolos.
Estas dos llamadas son equivalentes:
<%=h person.first_name %>
<%= h(person.first_name) %>
El método h
se utiliza comúnmente para escapar de HTML y Javascript a partir de formas de entrada del usuario.
Obtengo la <% = parte, pero ¿por qué exactamente es la h() necesaria en esta instancia ... Sé que el método h se usa para escapar de HTML y Javascript de los formularios de entrada del usuario, pero 1) ¿No puede decir simplemente <% = person.first_name%>? Si no, ¿por qué no ... es decir, qué problema específico es la resolución h()? es decir, ¿qué obtendrías si no llamaras al método h()? – user2101068
h
es un alias de método para html_escape
de la clase ERB::Util.
También existe un método en Rack para escanear HTML Rack::Utils.escape_html
en caso de que esté en Metal y quiera escapar algo de HTML.
Demasiado tarde para la fiesta, pero estoy agregando una explicación más de lo que está haciendo html_escape
para ayudar a otros noobs como yo a entender lo que está pasando. Los raíles 3 y posteriores automáticamente escapan todos los resultados ahora, por lo que hay muchas menos situaciones en las que se necesitará html_escape
aka h()
. El más notable de los cuales es cuando se va a utilizar el método de html_safe
en la construcción de vínculos con html en una clase presentador etc. Por ejemplo:
#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!!!
el enlace anterior puede causar problemas graves y abrirse a todo tipo de ataques xss (cross-site scripting). El ejemplo más simple, si un usuario guardó su nombre como "<script>alert('omg');</script>"
y usó html_safe
en él, hará que cualquier página que represente su supuesto nombre reciba una alerta diciendo 'omg'! Este es un problema importante. Para evitar esta DO:
<%=link_to "<span><i class='fa fa-user'></i>#{h(@user.name)}</span>".html_safe #Winning!
Por escapar de los datos potencialmente contaminados suministrados por un usuario que estamos homefree!
h es solo un alias para html_escape. Es un método de utilidad comúnmente utilizado para escapar html y javascript de los formularios de entrada del usuario. Convierte caracteres especiales en referencias de caracteres numéricos para que la representación no rompa su html.
Por ejemplo tener
<%= h "<p>Hello World</p>" %>
salida voluntad
<p>Hello World</p>
como texto para ver, no se aplicará párrafo. se codificará como
<p>Hello World</p>.
y en Rails 3 esto se hace automáticamente, por lo tanto, no será necesario. – lulalala
@lulalala ¿puede proporcionar un enlace para respaldar su reclamo de que esto se hace automáticamente en los carriles 3 (y 4)? – bfcoder
@bfcoder, esto se encuentra en todas las guías y documentos actuales de Rails. Cualquier cadena que no esté en una instancia de SafeBuffer será html escapada en una vista, aunque puede llamar a otros métodos de escape (como json, etc.) si los necesita. Creo que esta explicación es razonablemente completa: http://makandracards.com/makandra/2579-everything-you-know-about-html_safe-is-wrong – JasonTrue