Comprobar cabeceras CORS
Este comprobador de configuración de cabeceras CORS examina las cabeceras de respuesta que controlan el acceso entre orígenes en el navegador.
Ejecutar — gratis
Pegue un bloque de cabeceras para confirmar que Access-Control-Allow-Origin está presente, detectar la combinación insegura de un origen comodín con credenciales e identificar la ausencia de Vary: Origin cuando se permite un origen concreto. El resultado es determinista y explica cada hallazgo, por lo que resulta útil en revisiones de despliegue, investigaciones de incidentes, controles automatizados y tareas habituales de refuerzo de API, sin enviar solicitudes al servidor de destino.
Interprete el resultado como una revisión específica
Empiece copiando las cabeceras de respuesta exactamente como las recibió el navegador o el cliente de línea de comandos, con un par Nombre: valor por línea. Los nombres se comparan sin distinguir mayúsculas de minúsculas y los valores de Vary separados por comas se procesan como elementos independientes. El comprobador exige Access-Control-Allow-Origin porque, sin esa cabecera, no existe una política CORS de respuesta que pueda evaluar; por ello, su ausencia genera un error de entrada y no un informe inconcluso. Un resultado correcto incluye el origen permitido normalizado, si están habilitadas las credenciales, si la respuesta varía según Origin y una lista ordenada de hallazgos. El campo valid indica que no se detectaron problemas con gravedad de error. Aun así, puede haber una advertencia, por lo que los sistemas consumidores también deben revisar issue_count e issues. El alcance es deliberadamente concreto: aporta datos estables sobre dos fallos frecuentes, pero no pretende certificar todo el modelo de autorización de una aplicación. Conserve la respuesta original y el origen de la solicitud junto al resultado si este control forma parte de una auditoría.
Comprenda los orígenes comodín y las solicitudes con credenciales
Access-Control-Allow-Origin: * resulta práctico para recursos realmente públicos y sin credenciales, ya que permite que cualquier origen solicitante lea la respuesta. No debe combinarse con Access-Control-Allow-Credentials: true. Los navegadores rechazan esa pareja para el acceso CORS con credenciales y, con frecuencia, la configuración revela que el límite de confianza previsto por el servidor no se expresó correctamente. El comprobador registra la combinación como wildcard_origin_with_credentials con gravedad de error. La solución no consiste en reflejar automáticamente cualquier Origin recibido. Determine qué orígenes son de confianza, compare el Origin de la solicitud con una lista explícita de permitidos y emita un único origen aprobado solo cuando haya coincidencia. Si las cookies u otras credenciales ambientales no son necesarias, desactive las credenciales y mantenga la política pública con comodín. Recuerde además que CORS controla si los scripts del navegador pueden leer una respuesta; no sustituye la autenticación, la autorización, la protección contra falsificación de solicitudes ni un cortafuegos. Revise por separado los atributos de las cookies, los permisos, los métodos, las cabeceras expuestas y las solicitudes preliminares.
Utilice Vary: Origin para proteger las cachés compartidas
Cuando un servidor elige un valor específico de Access-Control-Allow-Origin según el Origin de la solicitud, la representación de la respuesta depende de hecho de esa cabecera. Vary: Origin informa a navegadores, proxies inversos y redes de distribución de contenido de que las respuestas generadas para orígenes distintos no son intercambiables. Si falta, una caché puede reutilizar para otra solicitud una respuesta que contiene el origen permitido de un inquilino, lo que provoca fallos intermitentes y puede debilitar las premisas de la política sobre contenido almacenado. Por eso, el comprobador genera missing_vary_origin cuando el origen permitido es específico y Vary no contiene ni Origin ni el comodín. Acepta Origin tanto en una línea con valores separados por comas como en cabeceras Vary repetidas. El hallazgo es una advertencia porque una respuesta pegada no permite saber si el origen es constante para todas las solicitudes o si el almacenamiento en caché está deshabilitado en otro punto. Confirme la lógica real del servidor y sus directivas de caché antes de cambiar producción. Si el origen se refleja dinámicamente tras validarlo con una lista permitida, añadir Origin a Vary suele ser la señal más clara y segura.
Qué puede hacer con ella
Revisar un despliegue de API
Pegue las cabeceras de una respuesta de preproducción y detecte ajustes inseguros de credenciales o variación de caché antes de publicar.
Investigar fallos CORS del navegador
Convierta cabeceras capturadas en hallazgos explícitos cuando una interfaz se comporte de forma distinta según el origen o la ruta de caché.
Automatizar controles de configuración
Procese bloques de cabeceras deterministas mediante la API en CI y haga fallar la política ante hallazgos con gravedad de error.
Preguntas frecuentes
¿Cuánto cuesta la comprobación?
La versión del navegador se ejecuta localmente y cada solicitud a la API cuesta $0.002.
¿Por qué es un error que falte Access-Control-Allow-Origin?
Esa cabecera constituye la base de una política de respuesta CORS. Sin ella, no hay un valor de origen permitido que este comprobador específico pueda evaluar.
¿Access-Control-Allow-Origin: * siempre es inseguro?
No. Es adecuado para ciertos recursos públicos que no admiten credenciales. El error solo se notifica cuando coinciden el origen comodín y las credenciales habilitadas.
¿Por qué la ausencia de Vary: Origin es una advertencia?
La respuesta por sí sola no permite saber si el origen cambia entre solicitudes o si un intermediario puede almacenarla. La advertencia invita a comprobar ese contexto.
¿Esto demuestra que un endpoint es seguro?
No. Comprueba dos errores habituales en cabeceras CORS. La autenticación, la autorización, las cookies, las solicitudes preliminares, los métodos y la protección contra falsificación requieren otra revisión.
¿Los nombres de cabecera distinguen mayúsculas?
No. Los nombres de las cabeceras HTTP y los elementos de las directivas relevantes se comparan sin distinguir mayúsculas de minúsculas.
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, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/security/cors-header-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"headers":"Access-Control-Allow-Origin: https://app.example.com\nAccess-Control-Allow-Credentials: true\nVary: Accept-Encoding, Origin"}'const res = await fetch("https://api.kit.forhosting.com/security/cors-header-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"headers": "Access-Control-Allow-Origin: https://app.example.com\nAccess-Control-Allow-Credentials: true\nVary: Accept-Encoding, Origin"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/cors-header-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"headers": "Access-Control-Allow-Origin: https://app.example.com\nAccess-Control-Allow-Credentials: true\nVary: Accept-Encoding, Origin"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/cors-header-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"headers":"Access-Control-Allow-Origin: https://app.example.com\\nAccess-Control-Allow-Credentials: true\\nVary: Accept-Encoding, Origin"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"headers":"Access-Control-Allow-Origin: https://app.example.com\nAccess-Control-Allow-Credentials: true\nVary: Accept-Encoding, Origin"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/cors-header-check", 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
{
"headers": "Access-Control-Allow-Origin: https://app.example.com\nAccess-Control-Allow-Credentials: true\nVary: Accept-Encoding, Origin"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.cors_header_check",
"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.
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. |