Como funciona esta verificação
O Scanaris verifica na resposta principal da tua página se estão presentes dois cabeçalhos: Cross-Origin-Opener-Policy (COOP) e Cross-Origin-Resource-Policy (CORP). Se faltar um ou os dois, abre um único achado de severidade baixa a indicar quais. Não avalia o valor, só a presença. São os dois cabeçalhos de isolamento de origem mais simples de adotar; o terceiro da família, Cross-Origin-Embedder-Policy, não é exigido porque parte qualquer recurso de terceiros que não coopere e raramente compensa num site normal.
O que protege cada um
O COOP decide se a tua janela partilha "grupo de contexto" com a que a abriu ou com as que tu abres. Com same-origin, uma página de outro domínio que abra a tua com window.open deixa de ter uma referência utilizável a ela (e vice-versa), o que corta ataques de manipulação entre separadores e fecha a via pela qual se exploram as fugas de memória do tipo Spectre. O CORP decide quem pode incorporar os teus recursos. Com same-origin, outro site não consegue carregar as tuas imagens, scripts ou fontes com uma etiqueta <img> ou <script> mesmo que os URL sejam públicos: o browser bloqueia a resposta antes de chegar a esse site. Nenhum dos dois corrige uma falha existente; são defesa em profundidade, e por isso a sua ausência é de severidade baixa.
Como adicioná-los
Valores recomendados para um site que não partilha recursos com outros domínios:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
- Nuxt: em
routeRulesdonuxt.config, na regra'/**', junto dos outros cabeçalhos. - Next.js: na função
headers()donext.config.js. - Vercel: no
vercel.json, secçãoheaders. Netlify: no_headers, sob/*. - nginx: duas linhas
add_header ... always;no blocoserver. Apache:Header always setno VirtualHost. - Express: o
helmet()adiciona-os por defeito nas versões recentes; confirma a versão que tens instalada.
Antes de os ativar, duas verificações
- Logins com janela pop-up. Se usas "Iniciar sessão com Google" ou outro fornecedor em modo pop-up, a janela precisa de falar com a que a abriu. Com
same-origindeixa de funcionar; usasame-origin-allow-popups, que mantém a proteção e permite esse caso. - Recursos que serves a outros domínios. Se as tuas imagens ou fontes são carregadas a partir de outro site teu (um blog noutro domínio, um widget que terceiros incorporam), o
same-originvai bloqueá-las lá. Usasame-sitese o outro site for um subdomínio, oucross-originnas rotas concretas desses recursos.
Confirma que está corrigido
curl -sI https://teudominio.com | grep -iE "^cross-origin-(opener|resource)-policy:"
Devem aparecer as duas linhas. Depois abre o teu site, testa o login e qualquer integração com pop-up, e vê a consola do browser: um recurso bloqueado pelo CORP aparece aí com uma mensagem explícita.
Perguntas frequentes
Isto substitui o CORS?
Não, são complementares e vão em direções opostas. O CORS abre as tuas respostas a origens concretas quando é preciso; o CORP fecha-as por defeito a quem as queira incorporar. Podes ter CORP same-origin em todo o site e CORS aberto numa rota de API.
Preciso também de Cross-Origin-Embedder-Policy?
Só se quiseres SharedArrayBuffer ou temporizadores de alta precisão (edição de vídeo, emuladores, algumas apps WebAssembly). O COEP exige que tudo o que incorporas leve CORP ou CORS, e a maioria dos scripts de terceiros não o faz. Para um site corrente, COOP e CORP chegam.
Quanto melhora a nota?
Pouco em pontos, porque é um achado de severidade baixa; mas é das poucas melhorias sem efeitos secundários se fizeres as duas verificações de cima. Os cabeçalhos que pesam mesmo estão em cabeçalhos de segurança e são explicados em cabeçalhos HTTP para humanos.