Sanitizacion HTML
Sanitizar HTML no confiable para prevenir ataques XSS. Basado en bluemonday.
La sanitizacion funciona parseando HTML y filtrandolo a traves de una politica de lista blanca. Los elementos y atributos no permitidos explicitamente son eliminados. La salida siempre es HTML bien formado.
Carga
local html = require("html")
Politicas Preconfiguradas
Tres politicas integradas para casos de uso comunes:
| Politica | Caso de Uso | Permite |
|---|---|---|
new_policy |
Sanitizacion personalizada | Nada (construir desde cero) |
ugc_policy |
Comentarios de usuario, foros | Formato comun (p, b, i, a, listas, etc.) |
strict_policy |
Extraccion de texto plano | Nada (elimina todo HTML) |
Politica Vacia
Crea una politica que no permite nada. Use esto para construir una lista blanca personalizada desde cero.
local policy, err = html.sanitize.new_policy()
policy:allow_elements("p", "strong", "em")
policy:allow_attrs("class"):globally()
local clean = policy:sanitize(user_input)
Devuelve: Policy, error
Politica de Contenido de Usuario
Preconfigurada para contenido generado por usuarios. Permite elementos de formato comunes.
local policy = html.sanitize.ugc_policy()
local safe = policy:sanitize('<p>Hello <strong>world</strong></p>')
-- '<p>Hello <strong>world</strong></p>'
local xss = policy:sanitize('<p>Hello <script>alert("xss")</script></p>')
-- '<p>Hello </p>'
Devuelve: Policy, error
Politica Estricta
Elimina todo HTML, devuelve solo texto plano.
local policy = html.sanitize.strict_policy()
local text = policy:sanitize('<p>Hello <b>world</b>!</p>')
-- 'Hello world!'
Devuelve: Policy, error
Control de Elementos
Permitir Elementos
Lista blanca de elementos HTML especificos.
local policy = html.sanitize.new_policy()
policy:allow_elements("p", "strong", "em", "br")
policy:allow_elements("h1", "h2", "h3")
policy:allow_elements("a", "img")
local result = policy:sanitize('<p>Hello <strong>world</strong></p>')
-- '<p>Hello <strong>world</strong></p>'
| Parámetro | Tipo | Descripción |
|---|---|---|
... |
string | Nombres de etiquetas de elementos |
Devuelve: Policy
Control de Atributos
Permitir Atributos
Iniciar permiso de atributos. Encadenar con on_elements() o globally().
policy:allow_attrs("href"):on_elements("a")
policy:allow_attrs("src", "alt"):on_elements("img")
policy:allow_attrs("class", "id"):globally()
| Parámetro | Tipo | Descripción |
|---|---|---|
... |
string | Nombres de atributos |
Devuelve: AttrBuilder
En Elementos Especificos
Permitir atributos solo en elementos especificos.
policy:allow_elements("a", "img")
policy:allow_attrs("href", "target"):on_elements("a")
policy:allow_attrs("src", "alt", "width", "height"):on_elements("img")
| Parámetro | Tipo | Descripción |
|---|---|---|
... |
string | Nombres de etiquetas de elementos |
Devuelve: Policy
En Todos los Elementos
Permitir atributos globalmente en cualquier elemento permitido.
policy:allow_attrs("class"):globally()
policy:allow_attrs("id"):globally()
Devuelve: Policy
Con Coincidencia de Patrón
Validar valores de atributos contra patrón regex.
-- Solo permitir colores hex en style
local builder, err = policy:allow_attrs("style"):matching("^color:#[0-9a-fA-F]{6}$")
if err then
return nil, err
end
builder:on_elements("span")
policy:sanitize('<span style="color:#ff0000">Red</span>')
-- '<span style="color:#ff0000">Red</span>'
policy:sanitize('<span style="background:red">Bad</span>')
-- '<span>Bad</span>'
| Parámetro | Tipo | Descripción |
|---|---|---|
pattern |
string | Patrón regex |
Devuelve: AttrBuilder, error
Seguridad de URL
URLs Estandar
Habilitar manejo de URL con valores predeterminados de seguridad.
policy:allow_elements("a")
policy:allow_attrs("href"):on_elements("a")
policy:allow_standard_urls()
Devuelve: Policy
Esquemas de URL
Restringir que esquemas de URL estan permitidos.
policy:allow_url_schemes("https", "mailto")
policy:sanitize('<a href="https://example.com">OK</a>')
-- '<a href="https://example.com">OK</a>'
policy:sanitize('<a href="javascript:alert(1)">XSS</a>')
-- '<a>XSS</a>'
| Parámetro | Tipo | Descripción |
|---|---|---|
... |
string | Esquemas permitidos |
Devuelve: Policy
URLs Relativas
Permitir o denegar URLs relativas.
policy:allow_relative_urls(true)
policy:sanitize('<a href="/page">Link</a>')
-- '<a href="/page">Link</a>'
| Parámetro | Tipo | Descripción |
|---|---|---|
allow |
boolean | Permitir URLs relativas |
Devuelve: Policy
Requerir URLs Parseables
Rechaza URLs que no se pueden parsear correctamente. Con true, las URLs de atributos que el sanitizador HTML no puede parsear son eliminadas en lugar de pasar.
policy:require_parseable_urls(true)
| Parámetro | Tipo | Descripción |
|---|---|---|
require |
boolean | Requerir que las URLs sean parseables |
Devuelve: Policy
Enlaces Nofollow
Agregar rel="nofollow" a todos los enlaces. Previene spam SEO.
policy:allow_attrs("href", "rel"):on_elements("a")
policy:require_nofollow_on_links(true)
policy:sanitize('<a href="https://example.com">Link</a>')
-- '<a href="https://example.com" rel="nofollow">Link</a>'
| Parámetro | Tipo | Descripción |
|---|---|---|
require |
boolean | Agregar nofollow |
Devuelve: Policy
Enlaces Noreferrer
Agregar rel="noreferrer" a todos los enlaces. Previene fuga de referrer.
policy:require_noreferrer_on_links(true)
| Parámetro | Tipo | Descripción |
|---|---|---|
require |
boolean | Agregar noreferrer |
Devuelve: Policy
Enlaces Externos en Nueva Pestana
Agregar target="_blank" a URLs completamente calificadas.
policy:allow_attrs("href", "target"):on_elements("a")
policy:add_target_blank_to_fully_qualified_links(true)
policy:sanitize('<a href="https://example.com">Link</a>')
-- '<a href="https://example.com" target="_blank">Link</a>'
| Parámetro | Tipo | Descripción |
|---|---|---|
add |
boolean | Agregar target blank |
Devuelve: Policy
Metodos de Conveniencia
Permitir Imagenes
Permitir <img> con atributos estandar.
policy:allow_images()
policy:sanitize('<img src="photo.jpg" alt="Photo">')
-- '<img src="photo.jpg" alt="Photo">'
Devuelve: Policy
Permitir Imagenes Data URI
Permitir imagenes base64 incrustadas.
policy:allow_elements("img")
policy:allow_attrs("src"):on_elements("img")
policy:allow_data_uri_images()
policy:sanitize('<img src="data:image/png;base64,iVBORw...">')
-- '<img src="data:image/png;base64,iVBORw...">'
Devuelve: Policy
Permitir Listas
Permitir elementos de lista: ul, ol, li, dl, dt, dd.
policy:allow_lists()
policy:sanitize('<ul><li>Item 1</li><li>Item 2</li></ul>')
-- '<ul><li>Item 1</li><li>Item 2</li></ul>'
Devuelve: Policy
Permitir Tablas
Permitir elementos de tabla: table, thead, tbody, tfoot, tr, td, th, caption.
policy:allow_tables()
policy:sanitize('<table><tr><td>Cell</td></tr></table>')
-- '<table><tr><td>Cell</td></tr></table>'
Devuelve: Policy
Permitir Atributos Estandar
Permitir atributos comunes: id, class, title, dir, lang.
policy:allow_elements("p")
policy:allow_standard_attributes()
policy:sanitize('<p id="intro" class="text" title="Introduction">Hello</p>')
-- '<p id="intro" class="text" title="Introduction">Hello</p>'
Devuelve: Policy
Sanitizar
Aplicar politica a string HTML.
local policy = html.sanitize.ugc_policy()
policy:require_nofollow_on_links(true)
local dirty = '<p>Hello</p><script>alert("xss")</script>'
local clean = policy:sanitize(dirty)
-- '<p>Hello</p>'
| Parámetro | Tipo | Descripción |
|---|---|---|
html |
string | HTML a sanitizar |
Devuelve: string
Errores
| Condición | Tipo | Reintentable |
|---|---|---|
| Patrón regex invalido | errors.INVALID |
no |
Consulte Manejo de Errores para trabajar con errores.