Sanear HTML
En cualquier lugar donde los usuarios puedan enviar texto enriquecido (comentarios, biografías, tickets de soporte, correos con formato) un atacante puede intentar colar una etiqueta de script. Este endpoint elimina el contenido ejecutable y los atributos peligrosos sin tocar el formato inofensivo que su usuario realmente quería.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
El problema: el texto enriquecido también es una superficie de ataque
En el momento en que una aplicación permite a un usuario enviar HTML, o deja que un editor de texto enriquecido genere HTML, también abrió una puerta para un cross-site scripting almacenado: una etiqueta de script, un manejador onerror en una imagen rota, un enlace javascript: o un iframe apuntando a donde no debería. Bloquear a mano un puñado de nombres de etiqueta deja pasar vectores menos obvios, como atributos de manejadores de eventos, URIs de datos o payloads en SVG, y cada omisión es una vulnerabilidad real en producción. data.html_sanitize lo construye gente que sigue esa lista de vectores como oficio, para que su equipo no tenga que hacerlo.
Qué ocurre en cada solicitud
Envíe POST a /data/html-sanitize con el HTML sin confiar, y recibirá un task_id de inmediato mientras el saneo corre en segundo plano. El HTML limpio, con las etiquetas de formato seguro conservadas y los scripts y atributos peligrosos eliminados, llega mediante una llamada de webhook firmada o queda disponible en un enlace firmado válido por 24 horas.
Lista blanca, no adivinanza
Un saneo bien hecho funciona por lista blanca, no por lista negra: en vez de intentar enumerar cada patrón peligroso, define qué etiquetas y atributos son seguros y descarta todo lo demás, incluido cualquier fragmento que un analizador de navegador tolerante con errores pudiera reinterpretar de una forma que el saneador no anticipó. Esto importa porque el análisis de HTML es notoriamente permisivo: los navegadores renderizan marcado mal formado que parece inofensivo en un contexto y se ejecuta en otro, exactamente el tipo de comportamiento que ha producido evasiones reales de XSS contra filtros ingenuos desde que existe la entrada de texto enriquecido en la web.
Cómo encaja en un flujo automatizado
Los sistemas de comentarios, los visores de tickets de soporte, la ingesta de contenido de un gestor de contenidos y cualquier flujo que le muestre a otros usuarios HTML escrito por usuarios debería sanear al recibir, no confiar en que el framework del frontend escape correctamente al mostrar. Como la tarea se cobra por solicitud y nunca se cobra si falla, resulta lo bastante barata como para correr en cada envío individual en vez de muestrear o confiar en validación del lado del cliente, y el flujo asíncrono por webhook permite que un formulario de comentarios acepte la entrada de inmediato y reemplace el contenido por la versión saneada apenas esté lista, sin bloquear al usuario con un escaneo síncrono.
Qué puede hacer con ella
Moderación de sección de comentarios
Una plataforma de blogs sanea cada comentario enviado antes de guardarlo, eliminando cualquier script o atributo de manejador de eventos que alguien intentó inyectar.
Tickets de soporte con texto enriquecido
Una mesa de ayuda sanea el HTML pegado en las respuestas de tickets para que los agentes vean mensajes con formato sin arriesgar un payload de XSS almacenado.
Campos de biografía y perfil de usuario
Una plataforma de comunidad sanea el HTML en las biografías de usuario, permitiendo negrita, enlaces y saltos de línea mientras bloquea cualquier contenido ejecutable.
Contenido de gestor de contenidos de colaboradores externos
Un medio de comunicación sanea el HTML enviado por redactores freelance antes de mostrarlo en el sitio en vivo, cerrando un vector de inyección común.
Preguntas frecuentes
¿Cómo saneo HTML con la API?
Envíe el HTML sin confiar por POST a /data/html-sanitize, guarde el task_id devuelto y reciba el HTML limpio por webhook o mediante un enlace firmado válido por 24 horas.
¿Es gratis la API para sanear HTML?
No, no hay plan gratuito ni prueba; cuesta $0.002 por solicitud, y una solicitud fallida nunca se cobra.
¿Elimina todos los vectores de XSS, incluidos los manejadores de eventos?
Sí, elimina etiquetas de script, enlaces javascript:, atributos de manejadores de eventos y otro contenido ejecutable, conservando solo etiquetas y atributos de formato seguro.
¿Sobrevive el formato seguro como negrita y enlaces?
Sí, las etiquetas de formato estándar y los atributos seguros se conservan por defecto, así que el texto enriquecido legítimo sigue mostrándose correctamente.
¿Es mejor que una lista negra de etiquetas hecha a mano?
Sí, funciona con una lista blanca de etiquetas y atributos conocidos como seguros en vez de intentar enumerar cada patrón peligroso, que es el enfoque que deja pasar vectores menos obvios.
¿Puedo sanear HTML por lote?
Sí, envíe una tarea asíncrona por documento y reciba cada resultado por webhook, algo ideal para importaciones masivas de contenido generado por usuarios.
¿Ya está disponible este endpoint?
Sí, data.html_sanitize está en producción y acepta solicitudes ahora mismo.
¿Se guarda el HTML enviado después?
No, tanto el HTML enviado como el saneado se eliminan después del período de retención y nunca se usan para entrenamiento.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/data/html-sanitize \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/data/html-sanitize", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/html-sanitize",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/html-sanitize", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/html-sanitize", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.html_sanitize",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |