Los html_helpers de Rails, como h y sanitize, son herramientas comunes para manejar entidades HTML, pero a veces necesitas alternativas más flexibles o potentes, como CGI, Nokogiri o HTMLEntities. Aquí te mostramos cómo usarlas y cuándo preferirlas.

Codificando y decodificando con CGI

Para codificar entidades HTML en Ruby, usa CGI.escapeHTML(). Este método convierte <, >, & y " en sus entidades seguras: &lt;, &gt;, &amp;, &quot;.

require 'cgi'
encoded = CGI.escapeHTML('<script>alert("¡Hola!")</script>')
# => "&lt;script&gt;alert(&quot;¡Hola!&quot;)&lt;/script&gt;"

Para decodificar, usa CGI.unescapeHTML():

decoded = CGI.unescapeHTML('&lt;script&gt;alert(&quot;¡Hola!&quot;)&lt;/script&gt;')
# => "<script>alert(\"¡Hola \

!")</script>"

Los métodos de CGI son ligeros y seguros, ideales para tareas simples.

Métodos de Rails

En Rails, usa h para codificar y proteger contra ataques XSS (inyecciones de código malicioso en páginas web):

# En el contexto de Rails
<%= h '<script>alert("¡Hola!")</script>' %>
# => "&lt;script&gt;alert(&quot;¡Hola!&quot;)&lt;/script&gt;"

El método raw renderiza HTML sin escapar, pero úsalo con cuidado, ya que puede exponer tu app a vulnerabilidades si el contenido no está sanitizado:

# Cuidado: usar raw sin sanitizar puede ser inseguro
<%= raw '<script>alert("¡Hola!")</script>' %>
# => "<script>alert(\"¡Hola!\")</script>" (se renderiza como HTML)

Nokogiri: una herramienta poderosa para HTML

Nokogiri es ideal para parsear y manipular documentos HTML/XML, no solo para codificar/decodificar entidades. Es perfecto para tareas complejas como extraer texto o modificar nodos.

require 'nokogiri'
doc = Nokogiri::HTML.parse("<div>¡Hola, mundo!</div>")
puts doc.text
# => "¡Hola, mundo!"

HTMLEntities: codificación avanzada

La gema HTMLEntities ofrece métodos avanzados para codificar y decodificar:

require 'htmlentities'
coder = HTMLEntities.new
encoded = coder.encode("<div>¡Hola, mundo!</div>")
# => "&lt;div&gt;¡Hola, mundo!&lt;/div&gt;"
decoded = coder.decode("&lt;div&gt;¡Hola, mundo!&lt;/div&gt;")
# => "<div>¡Hola, mundo!</div>"

Visualización

Imagina la codificación y decodificación de HTML como el trabajo de una oficina de correos:

La carta 📝 contiene caracteres especiales y datos sensibles.

Proceso de Codificación: Empaquetado Seguro

📝 ➡️ 📦 (los caracteres '<' y '>' se codifican como '&lt;' y '&gt;')

Proceso de Decodificación: Recuperación del Original

📦 ➡️ 📝 (las entidades '&lt;' y '&gt;' se decodifican de nuevo a '<' y '>')

La codificación protege los datos, mientras que la decodificación asegura que se muestren correctamente.

Recomendaciones para trabajar con Ruby y entidades HTML

  • Elección de librerías: Prioriza gemas activas, seguras y compatibles con tu proyecto. Por ejemplo, HTMLEntities es ideal para entidades complejas, mientras que CGI es ligero para tareas simples.
  • Prepárate para problemas:
  • HTML dañado: Usa Nokogiri con Nokogiri::XML::ParseOptions::RECOVER para manejar HTML mal formado.
  • Entidades no estándar: HTMLEntities soporta más entidades que CGI. Prueba coder.encode(text, :named) para nombres de entidades.
  • Rendimiento: CGI es rápido para datos pequeños; Nokogiri es más lento pero versátil para documentos grandes.
  • Usa ayudantes de Rails: Los métodos h, sanitize y strip_tags son clave para protegerte contra XSS en aplicaciones Rails.

Materiales útiles

Categorizado en:

Ruby,