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

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.