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.