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: <, >, &, ".
require 'cgi'
encoded = CGI.escapeHTML('<script>alert("¡Hola!")</script>')
# => "<script>alert("¡Hola!")</script>"Para decodificar, usa CGI.unescapeHTML():
decoded = CGI.unescapeHTML('<script>alert("¡Hola!")</script>')
# => "<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>' %>
# => "<script>alert("¡Hola!")</script>"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>")
# => "<div>¡Hola, mundo!</div>"
decoded = coder.decode("<div>¡Hola, mundo!</div>")
# => "<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 '<' y '>')Proceso de Decodificación: Recuperación del Original
📦 ➡️ 📝 (las entidades '<' y '>' 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,
HTMLEntitieses ideal para entidades complejas, mientras queCGIes ligero para tareas simples. - Prepárate para problemas:
- HTML dañado: Usa Nokogiri con
Nokogiri::XML::ParseOptions::RECOVERpara manejar HTML mal formado. - Entidades no estándar:
HTMLEntitiessoporta más entidades queCGI. Pruebacoder.encode(text, :named)para nombres de entidades. - Rendimiento:
CGIes 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,sanitizeystrip_tagsson clave para protegerte contra XSS en aplicaciones Rails.
Materiales útiles
- htmlentities | RubyGems.org — Gema para codificar/decodificar entidades HTML.
- Class: CGI (Ruby 3.x) — Documentación actualizada de la clase CGI.
- Nokogiri Documentation — Guía oficial de Nokogiri.
- Securing Rails Applications — Ruby on Rails Guides — Guía para proteger apps Rails contra XSS.
- GitHub – flavorjones/loofah — Librería Loofah para transformación y sanitización de HTML/XML.
- GitHub – rgrove/sanitize — Librería Sanitize para sanitización de HTML/CSS.

