Como melhorar a segurança no Manifesto V3
Esta é a última das três seções que descrevem as mudanças necessárias para o código que não faz parte do service worker de extensão. Ela descreve as alterações necessárias para melhorar a segurança das extensões. As outras duas seções abordam a atualização do código necessário para o upgrade para o Manifest V3 e a substituição do bloqueio de solicitações da Web.
Remover execução de strings arbitrárias
Não é mais possível executar a lógica externa usando executeScript()
, eval()
e new Function()
.
- Mova todo o código externo (JS, Wasm, CSS) para seu pacote de extensões.
- Atualize as referências de script e estilo para carregar recursos do pacote de extensões.
- Use
chrome.runtime.getURL()
para criar URLs de recursos no momento da execução. - Usar um iframe em sandbox:
eval
enew Function(...)
ainda são compatíveis com iframes em sandbox. Para mais detalhes, leia o guia sobre iframes em sandbox.
O método executeScript()
agora está no namespace scripting
em vez do namespace tabs
. Para informações sobre como atualizar chamadas, consulte Mover executeScript()
.
Existem alguns casos especiais em que ainda é possível executar strings arbitrárias:
- Injetar folhas de estilo hospedadas remotamente em uma página da Web usando insertCSS
- Para extensões que usam
chrome.devtools
: inspectWindow.eval permite a execução de JavaScript no contexto da página inspecionada. - As extensões do depurador podem usar chrome.debugger.sendCommand para executar o JavaScript em um destino de depuração.
Remover código hospedado remotamente
No Manifesto V3, toda a lógica da sua extensão precisa fazer parte do pacote de extensões. Não é mais possível carregar e executar arquivos hospedados remotamente de acordo com a política da Chrome Web Store. Por exemplo:
- Arquivos JavaScript extraídos do servidor do desenvolvedor.
- Qualquer biblioteca hospedada em uma CDN.
- Bibliotecas de terceiros agrupadas que buscam dinamicamente o código hospedado remotamente.
Há abordagens alternativas disponíveis, dependendo do caso de uso e do motivo da hospedagem remota. Esta seção descreve abordagens a serem consideradas. Se você está com problemas para lidar com código hospedado remotamente, temos orientações disponíveis.
Lógica e recursos orientados por configuração
Sua extensão carrega e armazena em cache uma configuração remota (por exemplo, um arquivo JSON) durante a execução. A configuração em cache determina quais recursos são ativados.
Lógica externalizada com um serviço remoto
Sua extensão chama um serviço remoto da Web. Isso permite manter a privacidade do código e alterá-lo conforme necessário, evitando a sobrecarga extra de reenvio para a Chrome Web Store.
Incorporar código hospedado remotamente em um iframe em sandbox
O código hospedado remotamente é compatível com iframes em sandbox. Essa abordagem não funciona se o código exigir acesso ao DOM da página de incorporação.
Agrupar bibliotecas de terceiros
Se você usa um framework conhecido como React ou Bootstrap carregado anteriormente de um servidor externo, pode fazer o download dos arquivos minimizados, adicioná-los ao projeto e importá-los localmente. Exemplo:
<script src="./react-dom.production.min.js"></script>
<link href="./bootstrap.min.css" rel="stylesheet">
Para incluir uma biblioteca em um service worker, defina a chave "background.type"
como "module"
no manifesto e use uma instrução import
.
Usar bibliotecas externas em scripts injetados por guias
Também é possível carregar bibliotecas externas no momento da execução adicionando-as à matriz files
ao chamar scripting.executeScript()
. Ainda é possível carregar dados remotamente durante a execução.
chrome.scripting.executeScript({
target: {tabId: tab.id},
files: ['jquery-min.js', 'content-script.js']
});
Injetar uma função
Se você precisar de mais dinamismo, a nova propriedade func
em scripting.executeScript()
permite injetar uma função como script de conteúdo e transmitir variáveis usando a propriedade args
.
let name = 'World!'; chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')` });
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); function showAlert(givenName) { alert(`Hello, ${givenName}`); } let name = 'World'; chrome.scripting.executeScript({ target: {tabId: tab.id}, func: showAlert, args: [name], });
O repositório de exemplos de extensão do Chrome (em inglês) contém um exemplo de injeção de função que você pode conferir. Um exemplo de getCurrentTab()
está na referência dessa função.
Procure outras soluções alternativas
Se as abordagens anteriores não ajudarem no seu caso de uso, talvez seja necessário encontrar uma solução alternativa (por exemplo, migrar para uma biblioteca diferente) ou encontrar outras maneiras de usar a funcionalidade da biblioteca. Por exemplo, no caso do Google Analytics, você pode mudar para o Measurement Protocol em vez de usar a versão oficial do JavaScript hospedada remotamente, conforme descrito no guia do Google Analytics 4.
Atualizar a Política de Segurança de Conteúdo
O "content_security_policy"
não foi removido do arquivo manifest.json
, mas agora é um dicionário compatível com duas propriedades: "extension_pages"
e "sandbox"
.
{ ... "content_security_policy": "default-src 'self'" ... }
{ ... "content_security_policy": { "extension_pages": "default-src 'self'", "sandbox": "..." } ... }
extension_pages
: refere-se a contextos na sua extensão, incluindo arquivos html e service workers.
sandbox
: refere-se a todas as páginas de extensão no modo sandbox usadas pela sua extensão.
Remover políticas de segurança de conteúdo sem suporte
O Manifesto V3 não permite determinados valores da Política de Segurança de Conteúdo no campo "extension_pages"
que eram permitidos no Manifesto V2. Especificamente, o Manifest V3 proíbe aqueles que permitem a execução remota de código. As diretivas script-src,
object-src
e worker-src
podem ter apenas estes valores:
self
none
wasm-unsafe-eval
- Somente extensões descompactadas: qualquer origem do localhost (
http://localhost
,http://127.0.0.1
ou qualquer porta nesses domínios)
Os valores da Política de Segurança de Conteúdo para sandbox
não têm essas novas restrições.