Cabeceras de seguridad
Un sitio puede tener un servidor blindado y aun así dejar la puerta abierta si sus cabeceras de respuesta nunca le indican al navegador qué bloquear. Esta API de cabeceras de seguridad obtiene una URL, lee las cabeceras de protección que realmente están presentes, y reporta qué está bien configurado, qué es débil y qué falta por completo, para que blindar un sitio sea una lista de verificación y no una suposición.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
La diferencia entre tener HTTPS y estar realmente blindado
Muchos equipos asumen que con el certificado instalado el trabajo de seguridad está terminado, pero el navegador todavía necesita instrucciones: si debe permitir la página dentro de un iframe, qué orígenes de script confiar, si debe forzar HTTPS en cada visita futura. Esas instrucciones viven por completo en un puñado de cabeceras de respuesta, y es perfectamente posible tener un sitio con cifrado impecable que las deje todas sin configurar.
Qué examina la comprobación
Llame a POST /web/security-headers con una URL y la tarea revisa la respuesta buscando las cabeceras relevantes para el blindaje —Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy y sus parientes cercanos— y devuelve, para cada una, si está presente, cuál es su valor y si ese valor protege de verdad o solo está ahí de forma testimonial.
Por qué existen precisamente estas cabeceras
La mayoría se agregaron a la plataforma web en respuesta a clases de ataque reales y bien documentadas: X-Frame-Options existe porque el clickjacking engaña al usuario para que haga clic en algo invisible superpuesto a una página legítima, y Content-Security-Policy existe porque la inyección de scripts seguía colándose aunque la entrada de datos se saneara. No son decorativas; cada una cierra una puerta que, en algún momento, quedó abierta en la práctica antes de que los navegadores acordaran una cabecera para cerrarla.
Cómo encaja en un flujo de seguridad
Como los resultados llegan por webhook firmado, la comprobación se integra sin fricción en un pipeline de integración continua como filtro antes de un release, en un escaneo periódico de cumplimiento sobre un portafolio de dominios, o en una auditoría puntual antes de tomar un cliente nuevo —en cualquier lugar donde de otra forma alguien tendría que abrir las herramientas de desarrollador y revisar cabeceras de memoria, lo cual inevitablemente termina en olvidar una.
Cómo leer un resultado con honestidad
Una cabecera ausente no es automáticamente un hallazgo crítico —una página estática de marketing sin entrada de usuario tiene un perfil de riesgo muy distinto al de un formulario de acceso— así que conviene tratar el reporte como punto de partida para un criterio propio según lo que el sitio realmente hace, no como un sello de aprobado o reprobado aplicado a ciegas.
Qué puede hacer con ella
Revisión de blindaje antes del lanzamiento
Ejecute una comprobación antes de que un sitio salga a producción para confirmar que las cabeceras que marcaría una auditoría de seguridad ya están en su lugar.
Auditorías de clientes y portafolios
Escanee una lista de dominios de clientes con regularidad para detectar una cabecera que se perdió en una migración de servidor o un cambio de proveedor.
Filtros de seguridad en integración continua
Haga que un pipeline de despliegue falle automáticamente si una cabecera obligatoria como Strict-Transport-Security desaparece de una compilación.
Debida diligencia de proveedores y terceros
Revise las cabeceras del sitio público de un socio como parte de una evaluación de seguridad ligera antes de integrarse con él.
Preguntas frecuentes
¿Qué cabeceras de seguridad revisa esta API?
Examina las cabeceras más relevantes para el blindaje del lado del navegador, incluyendo Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options y Referrer-Policy, reportando presencia y valor de cada una.
¿Una cabecera faltante significa que el sitio es inseguro?
No necesariamente. El impacto depende de lo que haga el sitio; una cabecera ausente en una página estática representa menos riesgo que el mismo hueco en una página que maneja datos de usuario o autenticación.
¿Existe un plan gratuito?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿En qué se diferencia de revisar cabeceras a mano en el navegador?
Automatiza la comprobación, la ejecuta de forma asíncrona a escala sobre cualquier cantidad de URLs, y entrega un resultado estructurado y firmado en vez de una lectura manual de texto crudo en las herramientas de desarrollador.
¿Cómo se entregan los resultados?
Mediante un webhook firmado cuando la tarea termina, recomendado para automatización, o un enlace firmado válido por 24 horas.
¿Se cobra una comprobación fallida?
No. Las tareas fallidas se reintentan automáticamente hasta tres veces sin costo; solo se cobran las comprobaciones completadas con éxito.
¿Cuánto cuesta una solicitud?
$0.002 por solicitud, precio fijo sin importar cuántas cabeceras se evalúen.
¿Puedo auditar muchos dominios en bloque?
Sí, envíe una tarea por cada URL y dé seguimiento por task_id; el modelo asíncrono está pensado para escanear portafolios completos de dominios con regularidad.
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/web/security-headers \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://ejemplo.com"}'const res = await fetch("https://api.kit.forhosting.com/web/security-headers", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://ejemplo.com"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/security-headers",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://ejemplo.com"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/security-headers", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://ejemplo.com"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.com"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/security-headers", 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
{
"url": "https://ejemplo.com"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.security_headers",
"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
timeout_sec | 30 |
max_crawl_pages | 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. |