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,
HTMLEntities
es ideal para entidades complejas, mientras queCGI
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 queCGI
. Pruebacoder.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
ystrip_tags
son 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.