Cómo funciona esta comprobación
Scanaris mira en la respuesta principal de tu página si están presentes dos cabeceras: Cross-Origin-Opener-Policy (COOP) y Cross-Origin-Resource-Policy (CORP). Si falta una o las dos, abre un único hallazgo de severidad baja indicando cuáles. No evalúa el valor, solo la presencia. Son las dos cabeceras de aislamiento de origen más sencillas de adoptar; la tercera de la familia, Cross-Origin-Embedder-Policy, no se exige porque rompe cualquier recurso de terceros que no coopere y rara vez compensa en una web normal.
Qué protege cada una
COOP decide si tu ventana comparte "grupo de contexto" con la que la abrió o con las que abres tú. Con same-origin, una página de otro dominio que abra la tuya con window.open deja de tener una referencia utilizable a ella (y al revés), lo que corta ataques de manipulación entre pestañas y cierra la vía por la que se explotan las fugas de memoria tipo Spectre. CORP decide quién puede incrustar tus recursos. Con same-origin, otro sitio no puede cargar tus imágenes, scripts o fuentes con una etiqueta <img> o <script> aunque las URL sean públicas: el navegador bloquea la respuesta antes de que llegue a ese sitio. Ninguna de las dos arregla un fallo existente; son defensa en profundidad, y por eso su ausencia es de severidad baja.
Cómo añadirlas
Valores recomendados para una web que no comparte recursos con otros dominios:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
- Nuxt: en
routeRulesdenuxt.config, en la regla'/**', junto al resto de cabeceras. - Next.js: en la función
headers()denext.config.js. - Vercel: en
vercel.json, secciónheaders. Netlify: en_headers, bajo/*. - nginx: dos líneas
add_header ... always;en el bloqueserver. Apache:Header always seten el VirtualHost. - Express:
helmet()las añade por defecto en versiones recientes; comprueba la versión que tienes instalada.
Antes de activarlas, dos comprobaciones
- Logins con ventana emergente. Si usas "Iniciar sesión con Google" u otro proveedor en modo popup, la ventana necesita hablar con la que la abrió. Con
same-origindeja de funcionar; usasame-origin-allow-popups, que mantiene la protección y permite ese caso. - Recursos que sirves a otros dominios. Si tus imágenes o fuentes se cargan desde otro sitio tuyo (un blog en otro dominio, un widget que incrustan terceros),
same-originlas bloqueará allí. Usasame-sitesi el otro sitio es un subdominio, ocross-originen las rutas concretas de esos recursos.
Comprueba que está arreglado
curl -sI https://tudominio.com | grep -iE "^cross-origin-(opener|resource)-policy:"
Deben salir las dos líneas. Después abre tu web, prueba el login y cualquier integración con popup, y revisa la consola del navegador: un recurso bloqueado por CORP aparece ahí con un mensaje explícito.
Preguntas frecuentes
¿Esto sustituye a CORS?
No, son complementarios y van en direcciones opuestas. CORS abre tus respuestas a orígenes concretos cuando hace falta; CORP las cierra por defecto a quien quiera incrustarlas. Puedes tener CORP same-origin en toda la web y CORS abierto en una ruta de API.
¿Necesito también Cross-Origin-Embedder-Policy?
Solo si quieres SharedArrayBuffer o temporizadores de alta precisión (edición de vídeo, emuladores, algunas apps WebAssembly). COEP exige que todo lo que incrustes lleve CORP o CORS, y la mayoría de scripts de terceros no lo hacen. Para una web corriente, COOP y CORP bastan.
¿Cuánto mejora la nota?
Poco en puntos, porque es un hallazgo de severidad baja; pero es de las pocas mejoras que no tienen efectos secundarios si haces las dos comprobaciones de arriba. El resto de cabeceras que sí pesan están en cabeceras de seguridad y las explica cabeceras HTTP para humanos.