Saneamiento de HTML
El módulo html sanea HTML no confiable mediante políticas basadas en bluemonday.
El saneamiento analiza un fragmento HTML y lo filtra mediante una política de elementos permitidos. Los elementos y atributos que la política no permite se eliminan, y el fragmento restante se normaliza durante la serialización.
Esta es una referencia de API. Los bloques de constructores son fragmentos de política autocontenidos; los bloques de métodos posteriores son fragmentos parciales de configuración que suponen que policy es una política ya creada. La salida saneada solo es adecuada para un contexto de contenido de elemento HTML. No es segura para interpolarla en JavaScript, CSS, URL ni atributos HTML; use un codificador apropiado para el contexto real de salida.
Cargar el módulo
local html = require("html")
Añada html a la lista modules: de la entrada ejecutable antes de requerirlo.
Políticas predefinidas
El módulo proporciona tres constructores de políticas predefinidas:
| Política | Caso de uso | Permite |
|---|---|---|
new_policy |
Saneamiento personalizado | Nada (se construye desde cero) |
ugc_policy |
Comentarios de usuario, foros | Formato comun (p, b, i, a, listas, etc.) |
strict_policy |
Extracción de texto plano | Nada (elimina todo HTML) |
Los tres constructores devuelven Policy, nil; actualmente la creación de políticas no falla.
Política vacía
Cree una política vacía y añada los elementos y atributos que deba permitir:
local policy, err = html.sanitize.new_policy()
if err then return nil, err end
policy:allow_elements("p", "strong", "em")
policy:allow_attrs("class"):globally()
local clean = policy:sanitize(user_input)
Devuelve: Policy, error
Política para contenido de usuario
Cree una política configurada para formatos habituales de contenido generado por usuarios:
local policy, err = html.sanitize.ugc_policy()
if err then return nil, err end
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
Política estricta
Cree una política estricta que elimine el HTML y devuelva texto plano:
local policy, err = html.sanitize.strict_policy()
if err then return nil, err end
local text = policy:sanitize('<p>Hello <b>world</b>!</p>')
-- 'Hello world!'
Devuelve: Policy, error
Control de elementos
Permitir Elementos
Permita elementos HTML concretos:
local policy, err = html.sanitize.new_policy()
if err then return nil, err end
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
Inicie una regla de atributos y aplíquela 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 específicos
Permita atributos solo en los elementos indicados:
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
Permita atributos en todos los elementos admitidos:
policy:allow_attrs("class"):globally()
policy:allow_attrs("id"):globally()
Devuelve: Policy
Con coincidencia de patrón
Exija que los valores de los atributos coincidan con una expresión regular:
-- Only allow hex colors in 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 | Expresión regular compatible con RE2 de Go |
Devuelve: AttrBuilder, error
Seguridad de las URL
URLs Estandar
Active la política estándar de tratamiento de URL. Exige URL analizables, permite URL relativas y los esquemas mailto, http y https, y añade rel="nofollow" a los elementos de enlace permitidos:
policy:allow_elements("a")
policy:allow_attrs("href"):on_elements("a")
policy:allow_standard_urls()
Devuelve: Policy
Esquemas de URL
Permita esquemas de URL específicos:
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
Configure si se permiten URL 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
Rechace las URL que no se puedan analizar correctamente. Con true, las URL de atributos que el saneador HTML no puede analizar se eliminan en lugar de dejarse pasar.
policy:require_parseable_urls(true)
| Parámetro | Tipo | Descripción |
|---|---|---|
require |
boolean | Requerir que las URLs sean parseables |
Devuelve: Policy
Enlaces Nofollow
Añada rel="nofollow" a los enlaces:
policy:allow_attrs("href", "rel"):on_elements("a")
policy:allow_url_schemes("https")
policy:require_parseable_urls(true)
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
Añada rel="noreferrer" a los enlaces:
policy:require_noreferrer_on_links(true)
| Parámetro | Tipo | Descripción |
|---|---|---|
require |
boolean | Agregar noreferrer |
Devuelve: Policy
Enlaces externos en una pestaña nueva
Añada target="_blank" a las URL completas:
policy:allow_attrs("href", "target"):on_elements("a")
policy:allow_url_schemes("https")
policy:require_parseable_urls(true)
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" rel="noopener">Link</a>'
| Parámetro | Tipo | Descripción |
|---|---|---|
add |
boolean | Agregar target blank |
Devuelve: Policy
Cuando abra enlaces no confiables en una pestaña nueva, active también require_noreferrer_on_links(true) para evitar la filtración del referente y mitigar el acceso a la ventana de origen.
Métodos auxiliares
Permitir imágenes
Permita <img> con align, alt, height, width y src. Este método también activa la política estándar de URL, pero no permite imágenes en URI de datos.
policy:allow_images()
policy:sanitize('<img src="photo.jpg" alt="Photo">')
-- '<img src="photo.jpg" alt="Photo">'
Devuelve: Policy
Permitir imágenes en URI de datos
Permita imágenes en URI de datos con Base64 sintácticamente válido y tipo gif, jpeg, png, svg+xml o webp. El saneador valida el tipo de medio y la codificación Base64, no el contenido decodificado de la imagen. Las URI de datos pueden transportar contenido activo; actívelas únicamente cuando confíe en los datos de la imagen:
policy:allow_elements("img")
policy:allow_attrs("src"):on_elements("img")
policy:allow_data_uri_images()
local input = '<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl2O9sAAAAASUVORK5CYII=">'
policy:sanitize(input)
-- The data URI is preserved.
Devuelve: Policy
Permitir Listas
Permita ul, ol, li, dl, dt y dd. El método también admite atributos type validados en ul, ol y li, además de un atributo entero value en li.
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, caption, col, colgroup, thead, tbody, tfoot, tr, td, th.
policy:allow_tables()
policy:sanitize('<table><tr><td>Cell</td></tr></table>')
-- '<table><tr><td>Cell</td></tr></table>'
Devuelve: Policy
Permitir atributos estándar
Permitir atributos comunes: id, 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" title="Introduction">Hello</p>'
Devuelve: Policy
Sanear
Aplique una política a una cadena HTML:
local policy, err = html.sanitize.ugc_policy()
if err then return nil, err end
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
sanitize solo devuelve una cadena. En el entorno de ejecución v0.3.32a, el analizador de fragmentos subyacente puede convertir en una cadena vacía una entrada mal formada que no puede analizar, y el envoltorio Lua no puede distinguir ese caso de una entrada válida cuyo contenido eliminó la política. Trate el saneamiento como filtrado de salida, no como validación de entrada; valide por separado el contenido obligatorio cuando un resultado vacío sea relevante.
Errores
| Condición | Tipo | Reintentable |
|---|---|---|
| Patrón de expresión regular no válido | errors.INVALID |
no |
Consulte Manejo de errores para trabajar con errores.