2008-11-17 18 views

Respuesta

89

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.

+12

y en Rails 3 esto se hace automáticamente, por lo tanto, no será necesario. – lulalala

+1

@lulalala ¿puede proporcionar un enlace para respaldar su reclamo de que esto se hace automáticamente en los carriles 3 (y 4)? – bfcoder

+1

@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

14

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

+0

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

12

h es un alias de método para html_escape de la clase ERB::Util.

6

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.

1

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!

0

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

&lt;p&gt;Hello World&lt;/p&gt;. 
Cuestiones relacionadas