link_to - No escapes html en ruby on rails
content_tag link_to rails (2)
Me encontré con lo mismo y descubrí una solución más segura que usar html_safe
, especialmente una vez que introduces cadenas que son dinámicas.
Primero, el código actualizado:
def good_time(long_message1, long_message2, status = true)
html = "".html_safe
html << "Status is #{status}, "
if status
html << long_message1
else
html << long_message2
end
html
end
<%= good_time(true) %>
Esto escapa el contenido long_message
si no es seguro, pero lo deja sin guardar si es seguro.
Esto permite "long message for success & such."
para mostrar correctamente, pero también se escapa "malicious message <script>alert(''foo'')</script>"
.
La explicación se reduce a esto: ''foo''.html_safe
devuelve un ActiveSupport :: SafeBuffer que actúa como una cadena en todos los sentidos excepto en uno: cuando añades una cadena a un SafeBuffer (llamando a + o <<), esa otra cadena está escapado en HTML antes de ser anexado a SafeBuffer. Cuando agrega otro SafeBuffer a SafeBuffer, no se producirá ningún escape. Rails está visualizando todas sus vistas bajo el capó utilizando SafeBuffers, por lo que el método actualizado anterior proporciona a Rails un SafeBuffer que hemos controlado para realizar long_message
en long_message
"según sea necesario" en lugar de "siempre".
Ahora, el mérito de esta respuesta corresponde enteramente a Henning Koch, y se explica con más detalle en Todo lo que sabes acerca de que html_safe es incorrecto . Mi resumen anterior solo intenta dar la esencia de la explicación en caso de que este enlace muera alguna vez. .
rails 3 parece escapar de todo, incluido html. He intentado usar raw () pero todavía escapa html. ¿Hay alguna solución? Este es mi ayudante que estoy usando (/helpers/application_helper.rb):
module ApplicationHelper
def good_time(status = true)
res = ""
if status == true
res << "Status is true, with a long message attached..."
else
res << "Status is false, with another long message"
end
end
end
Estoy llamando al ayudante desde mi punto de vista usando este código:
<%= raw(good_time(true)) %>
Puedes usar .html_safe
así:
def good_time(status = true)
if status
"Status is true, with a long message attached...".html_safe
else
"Status is false, with another long message".html_safe
end
end
<%= good_time(true) %>