O Microsoft Edge desabilitará a modificação document.domain

Aviso

Se o seu site depende do relaxamento da política de mesma origem por meio document.domainde , sua ação é necessária. Continue a ler mais sobre por que isso está mudando ou acesse a Comunicação alternativa entre origens para saber mais sobre mecanismos alternativos para obter a comunicação entre origens.

Introdução

A propriedade "domain" da interface Document obtém ou define a parte do domínio da origem do documento atual, conforme usado pela política de mesma origem.

O Microsoft Edge herdou essa alteração do Chromium. As tentativas de modificar a propriedade usando JavaScript document.domain agora são ignoradas. Você precisará usar abordagens alternativas, como postMessage() ou a API de Mensagens de Canal, para se comunicar entre origens. Essa alteração está no Edge 119 e posterior.

Como alternativa, se o seu site depender do relaxamento document.domain da política de mesma origem para funcionar corretamente, o site poderá enviar um Origin-Agent-Cluster: ?0 cabeçalho; esse cabeçalho deverá ser enviado de todos os outros documentos que exijam a flexibilização.

Observação

document.domain não terá efeito se apenas um documento o definir.

Por que tornar document.domain imutável?

Alguns sites são definidos document.domain para permitir a comunicação entre páginas do mesmo site, mas com origens cruzadas. A configuração document.domain possibilita que documentos do mesmo site se comuniquem com mais facilidade. Como essa alteração relaxa a política de mesma origem, uma página pai pode acessar o documento de um iframe do mesmo site e percorrer a árvore DOM e vice-versa.

Importante

Os sites de mesmo site, mas de origem cruzada, têm o mesmo eTLD+1 , mas subdomínios diferentes.

Digamos que uma página no https://parent.example.com incorpore uma página iframe de https://video.example.com. Essas páginas têm o mesmo eTLD+1 (example.com) com subdomínios diferentes. Quando ambas as páginas estão document.domain definidas como 'example.com', o navegador trata as duas páginas como se fossem da mesma origem.

Esta técnica é conveniente; mas apresenta um risco de segurança.

Preocupações de segurança com document.domain

Preocupações de segurança levaram document.domain a uma mudança na especificação que avisa os desenvolvedores sobre essa preocupação e diz a eles para evitar usá-lo, se possível. A discussão atual com outros fornecedores de navegadores está se movendo na mesma direção.

Os exemplos a seguir mostram como um invasor pode abusar do document.domain.

Considere um serviço de hospedagem compartilhada que fornece um subdomínio exclusivo para cada cliente. Se um desenvolvedor definir document.domain em sua página, a página de um invasor servida de um subdomínio diferente poderá definir o mesmo valor e modificar o conteúdo da página da vítima.

Da mesma forma, considere um serviço de hospedagem compartilhada que atende páginas usando uma porta diferente para cada cliente. Se um desenvolvedor definir document.domain em sua página, a página de um invasor servida de uma porta diferente poderá definir o mesmo valor e modificar o conteúdo da página da vítima. Esse ataque é possível porque document.domain ignora o componente de número de porta da origem.

Observação

Para saber mais sobre as implicações de segurança da configuração document.domain, leia o artigo Document.domain no MDN.

Como saberei se meu site foi afetado?

Se o seu site for afetado por essa alteração, o Microsoft Edge mostrará um aviso no painel Problemas do DevTools. A captura de tela a seguir mostra um exemplo desse aviso.

Aviso quando document.domain é modificado.

Se você tiver um ponto de extremidade de relatório configurado, também receberá relatórios de substituição. Saiba mais sobre como usar a API de relatórios com os serviços de coleta de relatórios existentes ou criando sua própria solução de relatórios.

Dica

Você pode executar seu site por meio da auditoria de API preterida do LightHouse para encontrar todas as APIs que estão agendadas para serem removidas do Microsoft Edge.

Comunicação alternativa entre origens

Atualmente, você tem duas opções para substituir document.domain seu site. Na maioria dos casos de uso, postMessage() de origem cruzada ou a API de mensagens de canal pode substituir document.domain.

A lista a seguir mostra as etapas que um desenvolvedor precisa seguir para usar postMessage() em vez de document.domain para manipulação DOM entre origens.

  1. https://parent.example.com envia uma mensagem para postMessage() um iframe contendo https://video.example.com a solicitação para modificar seu próprio DOM.
  2. https://video.example.com manipula seu DOM e o usa postMessage para notificar o pai sobre seu sucesso.
  3. https://parent.example.com reconhece o sucesso.

Para a etapa 1 em https://parent.example.com:


// Configure a handler to receive messages from the subframe.
iframe.addEventListener('message', (event) => { 

// Reject all messages except from https://video.example.com 
  if (event.origin !== 'https://video.example.com') return;
  
  // Filter success messages 
    if (event.data === 'succeeded') { 

    // DOM manipulation is succeeded 

  } 

}); 

// Send a message to the subframe at https://video.example.com

iframe.postMessage('Request DOM manipulation', 'https://video.example.com'); 

Para a etapa 2 em https://video.example.com:


// Configure a handler to receive messages from the parent frame.
window.addEventListener('message', (event) => {
 
  // Reject all messages except ones from https://parent.example.com 
  
  if (event.origin !== 'https://parent.example.com') return;
  
  // Perform requested DOM manipulation on https://video.example.com.
  
  if (event.data === "showTheButton") {
     document.getElementById('btnContinue').style.visibility = 'visible';
     // Send a success message back to the parent.

     event.source.postMessage('succeeded', event.origin); 
  }
}); 

Enviar o Origin-Agent-Cluster: ?0 cabeçalho como último recurso

Se você tiver fortes motivos para continuar a configuração document.domain, poderá enviar Origin-Agent-Cluster: ?0 o cabeçalho de resposta no documento de destino.

Origin-Agent-Cluster: ?0 

O Origin-Agent-Cluster cabeçalho instrui o navegador se o documento deve ser manipulado pelo cluster de agente com chave de origem ou não. Para saber mais sobre Origin-Agent-Cluster, leia Solicitando isolamento de desempenho com o cabeçalho Origin-Agent-Cluster.

Quando você envia esse cabeçalho, o documento pode continuar a ser definido document.domain mesmo depois de se tornar imutável por padrão.

Compatibilidade do navegador

As organizações a seguir dão suporte à substituição document.domain no interesse da compatibilidade do navegador.

Outros recursos

Licença de conteúdo

Observação

Partes desta página são modificações baseadas no trabalho criado e compartilhado pela Chromium.org e usadas de acordo com os termos descritos na Licença Pública Creative Commons Atribuição 4.0 Internacional. A página original pode ser encontrada aqui.

Licença Creative Commons
Esse trabalho é licenciado sob uma Licença Attribution 4.0 International da Creative Commons.