Conteúdo Misto
O que é conteúdo misto, por que o conteúdo misto ativo é bloqueado enquanto o passivo é apenas avisado, e como detectar e corrigir sub-recursos inseguros em escala — o console do navegador, relatórios de CSP, upgrade-insecure-requests, block-all-mixed-content, e como CMSs e tecnologia de anúncios o reintroduzem.
Idiomas
Conteúdo misto é uma página HTTPS carregando um sub-recurso via HTTP. A taxonomia atual dos navegadores é atualizável versus bloqueável; a divisão antiga ativo/passivo ainda acompanha isso para a maioria dos tipos, com exceções (imagens com CORS habilitado, srcset/picture e solicitações para hosts IP são bloqueáveis, não atualizáveis). Conteúdo misto ativo — scripts, folhas de estilo, iframes, XMLHttpRequest/fetch — é bloqueado diretamente porque um script adulterado pode reescrever a página inteira, então é isso que realmente quebra um site após uma migração HTTP→HTTPS; corrija isso primeiro. Conteúdo misto passivo — imagens, áudio, vídeo — historicamente carregava com um cadeado rebaixado e agora é cada vez mais atualizado automaticamente ou também bloqueado. Links de âncora e outra navegação HTTP de nível superior não são conteúdo misto, assim como downloads inseguros (uma fronteira relacionada, mas separada). Encontre isso no código-fonte buscado, no estado renderizado/em tempo de execução e em sessões de usuários reais: rastreie o site HTTPS, observe o console do Chrome DevTools (a redação exata é específica do navegador/versão) ou colete violações de Content-Security-Policy-Report-Only; corrija confirmando primeiro que o equivalente HTTPS realmente funciona, depois aponte cada sub-recurso para https:// (caminhos relativos/relativos ao protocolo somente após verificar a propriedade e o comportamento da URL base). O cabeçalho Content-Security-Policy: upgrade-insecure-requests reescreve solicitações de sub-recursos http:// no escopo — incluindo as de origem cruzada — para https:// antes de serem enviadas e antes que as verificações de conteúdo misto/CSP sejam executadas; não tem fallback HTTP se a atualização falhar, é uma rede de segurança em vez de um substituto para limpar a fonte, NÃO atualiza a navegação de nível superior para origens de terceiros (portanto, não é um substituto para HSTS), e definir a diretiva em modo somente relatório é um no-op — monitore com uma política separada somente relatório. Bancos de dados de CMS (faça backup e teste substituições — substituição ingênua de strings pode corromper dados serializados), plugins/temas, service workers/caches e tags de anúncios/análises são os reincidentes usuais; audite em escala com um rastreador e relatórios de CSP em vez de página por página.
TL;DR — Conteúdo misto é quando uma página segura
https://carrega algo — uma imagem, um script, uma folha de estilo — porhttp://inseguro. Isso mistura uma página segura com partes inseguras, o que anula o propósito do HTTPS. Os navegadores bloqueiam os tipos perigosos (scripts, estilos, iframes) e avisam sobre os tipos mais leves (imagens, mídia). É a coisa mais comum que quebra um site logo depois de você mudar para HTTPS, e a correção é simples: faça cada recurso carregar porhttps://também.
O que é conteúdo misto
Quando você move um site para HTTPS, a página em si carrega com segurança. Mas uma página nunca é
apenas o HTML — ela puxa imagens, scripts, folhas de estilo, fontes, vídeos e,
às vezes, frames incorporados de outros lugares. Se qualquer uma dessas partes ainda for
solicitada por http:// simples, você tem conteúdo misto: uma página segura carregando
carga insegura. Evidence for this claim Mixed content occurs when a secure page loads resources over insecure HTTP, and browsers upgrade or block mixed-content requests by resource type. Scope: MDN documents current browser categories and behavior; individual browser versions may differ at the margins. Confidence: high · Verified: MDN: Mixed content
Como o próprio explicador do Google coloca, “A page has mixed content when its initial HTML is loaded over a secure HTTPS connection, but other resources (such as images, videos, stylesheets, and scripts) are loaded over an insecure HTTP connection.” (tradução) «Uma página tem conteúdo misto quando seu HTML inicial é carregado por uma conexão HTTPS segura, mas outros recursos (como imagens, vídeos, folhas de estilo e scripts) são carregados por uma conexão HTTP insegura.»
Isso importa porque as partes inseguras reabrem exatamente o buraco que o HTTPS fechou.
Qualquer pessoa na rede entre o visitante e o servidor pode ler ou adulterar
essas solicitações http:// — então o cadeado na barra de endereço está prometendo mais
segurança do que a página realmente tem.
Os dois tipos, e o que os navegadores fazem com eles
Os navegadores não tratam todo conteúdo misto da mesma forma. Eles o classificam por quanto dano o recurso inseguro poderia causar:
- Conteúdo misto ativo — scripts, folhas de estilo e iframes. Eles podem controlar a página inteira, então um adulterado poderia reescrever tudo. Os navegadores bloqueiam. Isso é o que realmente quebra seu layout, sua interatividade ou um widget incorporado inteiro após uma migração.
- Conteúdo misto passivo — imagens, áudio e vídeo. Eles não podem assumir o controle da página, então os navegadores historicamente os carregaram, mas removeram o cadeado e mostraram um aviso de “não totalmente seguro”. Isso está mudando — navegadores modernos cada vez mais atualizam ou bloqueiam esses também.
Uma coisa que não é conteúdo misto: um link simples (<a href="http://…">) para uma
página HTTP. Isso apenas navega você para algum lugar; não carrega uma parte insegura na sua
página segura.
Como corrigir
A correção é quase sempre a mesma: faça o recurso inseguro carregar por HTTPS.
Mude http:// para https:// na referência, ou use um caminho que não codifique
hard-coded o protocolo. Na maioria das vezes, o recurso já está disponível por HTTPS —
alguém apenas deixou uma URL http:// antiga em um template, um plugin ou no banco de dados.
Se você quiser uma rede de segurança para qualquer coisa que você perdeu, você pode adicionar uma única linha de
configuração — o cabeçalho upgrade-insecure-requests — que diz ao navegador para
reescrever silenciosamente solicitações de recursos http:// restantes para https:// antes de enviá-las.
É um ótimo plano de contingência, mas não é motivo para pular a limpeza da fonte
real. Evidence for this claim The upgrade-insecure-requests CSP directive rewrites insecure URLs as secure URLs before requests are made. Scope: MDN documents the directive's rewriting behavior and limits; it does not guarantee that an HTTPS version of every resource exists. Confidence: high · Verified: MDN: CSP upgrade-insecure-requests
Quer o quadro completo — as listas exatas de recursos que os navegadores bloqueiam, como detectar
conteúdo misto em escala com o console do DevTools e relatórios de CSP, as
diretivas upgrade-insecure-requests e block-all-mixed-content, por que seu CMS
continua reintroduzindo isso, e como o conteúdo misto interage com HSTS? Mude para a
aba Avançado.
TL;DR — Conteúdo misto é uma página HTTPS carregando um sub-recurso via HTTP. A taxonomia atual do navegador/W3C classifica isso em conteúdo atualizável e bloqueável; a divisão mais antiga ativo/passivo (usada abaixo como uma estrutura de raio de explosão) ainda acompanha essa divisão para a maioria dos tipos de recurso, com exceções — imagens habilitadas para CORS, candidatos
srcset/picturee solicitações de host IP são bloqueáveis, embora umimg srcsimples seja atualizável. Ativo (scripts, folhas de estilo, iframes,XMLHttpRequest/fetche qualquer coisa que o navegador execute) é bloqueado — um script adulterado pode reescrever a página — então é a regressão do dia do lançamento para corrigir primeiro. Passivo (imagens, áudio, vídeo) historicamente carregava com um indicador rebaixado e agora é cada vez mais atualizado automaticamente ou bloqueado. Âncoras e outra navegação HTTP de nível superior não são conteúdo misto; nem são downloads inseguros, que são um limite relacionado, mas separado. Detecte isso em três camadas — fonte buscada, estado renderizado/em tempo de execução e sessões reais de usuário — rastreando o site HTTPS, lendo o console do Chrome DevTools (a redação exata é específica do navegador/versão) ou coletando violações deContent-Security-Policy-Report-Only; corrija confirmando que um equivalente HTTPS realmente funciona, então aponte cada sub-recurso parahttps://(caminhos relativos/relativos ao protocolo são aceitáveis depois que você verificar a propriedade e o comportamento da URL base, não um padrão universal).Content-Security-Policy: upgrade-insecure-requestsreescreve solicitações de sub-recursoshttp://no escopo (incluindo as de origem cruzada) parahttps://antes de serem enviadas e antes das verificações de conteúdo misto/CSP serem executadas — uma rede, não um substituto para corrigir a fonte, com nenhum fallback HTTP se a atualização falhar, e isso não atualiza a navegação de nível superior para origens de terceiros, então não substitui o HSTS. Colocar a diretiva em modo somente relatório é um no-op — monitore com uma política separada somente relatório. Bancos de dados CMS (faça backup e teste qualquer substituição — substituição ingênua de strings pode corromper dados serializados), plugins, temas, service workers/caches e tags de anúncios/analytics são os reincidentes recorrentes — audite em escala, não página por página.
O hub HTTPS apresenta conteúdo misto como um dos dois modos de falha do dia do lançamento de uma migração (o outro sendo redirecionamentos). Este é o mergulho profundo para o qual ele aponta — os níveis exatos de recursos, a pilha de detecção, as diretivas CSP e as razões operacionais pelas quais ele continua voltando.
O que conta como conteúdo misto — e o que não conta
Conteúdo misto é definido com precisão: trata-se de sub-recursos que a página carrega, não de links que a página contém. A definição do Google: “A page has mixed content when its initial HTML is loaded over a secure HTTPS connection, but other resources (such as images, videos, stylesheets, and scripts) are loaded over an insecure HTTP connection.” Evidence for this claim Mixed content occurs when a secure page loads resources over insecure HTTP, and browsers upgrade or block mixed-content requests by resource type. Scope: MDN documents current browser categories and behavior; individual browser versions may differ at the margins. Confidence: high · Verified: MDN: Mixed content (tradução) «Uma página tem conteúdo misto quando seu HTML inicial é carregado por uma conexão HTTPS segura, mas outros recursos (como imagens, vídeos, folhas de estilo e scripts) são carregados por uma conexão HTTP insegura.»
A armadilha que tranquiliza as pessoas falsamente é a tag de âncora. Um link <a href="http://…">
para uma página HTTP não é conteúdo misto — ele navega para um novo documento; ele
não carrega um recurso inseguro no documento seguro atual. Isso é verdade para qualquer
navegação de nível superior para uma página HTTP, não apenas cliques em âncoras.
Ainda vale a pena enviar links de saída para destinos HTTPS. Sob a política
Referrer-Policy padrão moderna do navegador (strict-origin-when-cross-origin), um clique de
uma página HTTPS para um destino HTTP de fato remove o cabeçalho Referer, o que pode prejudicar
as análises de referência — mas esse comportamento é dependente de política e navegador, não uma
regra universal: uma página (ou um proxy/CDN upstream) que define uma
Referrer-Policy mais permissiva ainda pode enviar um referenciador nesse rebaixamento. Verifique a
Referrer-Policy real em vigor antes de afirmar quantos dados de referência um determinado site
perde — mas em qualquer caso, isso é um problema separado do conteúdo misto, não o próprio conteúdo
misto.
Ativo vs. passivo: a distinção que define suas prioridades
A documentação moderna de navegadores e do W3C classifica o conteúdo misto principalmente como conteúdo atualizável versus bloqueável — tipos de recursos que o navegador tentará silenciosamente novamente por HTTPS versus aqueles que ele recusa totalmente — em vez da divisão mais antiga entre ativo/passivo. Ativo/passivo ainda é uma abreviação útil para por que os navegadores traçam essa linha (o quanto da página o recurso poderia comprometer), e é assim que o próprio explicador do Google o enquadra, então é mantido abaixo como o enquadramento principal de triagem — apenas não o trate como a taxonomia oficial atual quando você precisar raciocinar sobre um tipo específico de recurso; veja as exceções após as duas listas.
Os navegadores classificam o conteúdo misto pelo quanto da página o recurso inseguro poderia comprometer. Google: “Active mixed content poses a greater threat than passive mixed content.” (tradução) «O conteúdo misto ativo representa uma ameaça maior do que o conteúdo misto passivo.» Essa única frase deve orientar sua ordem de triagem.
O conteúdo misto ativo interage com — e pode assumir o controle de — toda a página. O Google o descreve como “scripts, stylesheets, iframes, and any other code the browser can download and execute.” (tradução) «scripts, folhas de estilo, iframes e qualquer outro código que o navegador possa baixar e executar.» Na prática, a lista ativa é:
<script src="http://…">— o pior caso; um script interceptado pode reescrever todo o DOM, exfiltrar dados de formulários ou injetar conteúdo.<link rel="stylesheet" href="http://…">— o CSS pode ocultar, reposicionar ou sobrepor qualquer coisa, então é tratado como ativo.<iframe src="http://…">— um documento inseguro incorporado dentro do seu documento seguro.XMLHttpRequest/fetch()parahttp://— dados inseguros sobre os quais a página então age.- Fontes da web, recursos
<object>/<embed>e as variantes<link>que trazem conteúdo executável ou que controla o layout.
Como um recurso ativo adulterado pode reescrever a página, “Most browsers already block this type of content by default to protect users.” (tradução) «A maioria dos navegadores já bloqueia esse tipo de conteúdo por padrão para proteger os usuários.» É por isso que o conteúdo misto ativo é o que visivelmente quebra as coisas após uma migração — uma folha de estilo bloqueada remove seu CSS, um script bloqueado mata a interatividade, um iframe bloqueado deixa um buraco. Corrija o ativo primeiro. É um bug funcional, não apenas um aviso de segurança.
Conteúdo misto passivo (de exibição) — Google: “including images, video, and audio” (tradução) «incluindo imagens, vídeo e áudio» — “doesn’t interact with the rest of the page.” (tradução) «não interage com o resto da página.» Uma imagem interceptada pode ser trocada, mas não pode tomar o documento. Então, historicamente, os navegadores o carregavam e apenas rebaixavam o indicador: “Until recently, passive mixed content was loaded in all browsers, because blocking it would have broken many websites. This is now beginning to change.” (tradução) «Até recentemente, o conteúdo misto passivo era carregado em todos os navegadores, porque bloqueá-lo teria quebrado muitos sites. Isso agora está começando a mudar.» A direção do movimento nos navegadores é para atualizar automaticamente recursos passivos para HTTPS quando possível e bloquear o que não pode ser atualizado, então “passivo = inofensivo” não é mais uma suposição segura para se basear.
Exceções que a divisão ativo/passivo não captura
A linha atualizável/bloqueável tem várias exceções que não seguem o padrão geral “imagens atualizam, scripts bloqueiam” acima — estes são os casos que realmente pegam as pessoas na prática:
- Solicitações de imagem com CORS ativado falham, não são atualizadas. Um
<img src="http://…">comum é atualizável, mas uma solicitação de imagem feita comcrossorigindefinido é tratada de forma diferente pelo algoritmo de conteúdo misto e falha em vez de ser atualizada silenciosamente. - Candidatos de
srcsete<picture>são bloqueáveis, não atualizáveis. A mesma imagem, solicitada por meio de um mecanismo de imagem responsiva em vez de umsrcsimples, cai na categoria bloqueável — não presuma que toda referência de imagem se comporta da mesma forma. - Hosts com endereço IP são bloqueados, não atualizados, mesmo para um tipo de
recurso que seria atualizável. Uma referência como
http://203.0.113.5/logo.pngnão recebe o tratamento de atualização automática que um equivalente hospedado em domínio receberia. - Contextos aninhados e workers estão no escopo. As verificações de conteúdo misto se aplicam dentro de iframes e dentro de service/shared workers também, não apenas no documento principal — um worker buscando um script inseguro ainda é conteúdo misto.
- Origens locais e de loopback têm suas próprias nuances.
localhost, endereços de loopback e contextosfile://são “origens potencialmente confiáveis” de acordo com a especificação, mesmo sem TLS, então uma heurística simples de HTTP vs. HTTPS não se aplica diretamente a ambientes de desenvolvimento local. - Downloads inseguros são um limite relacionado, mas separado. Um download
iniciado de uma página segura via
http://é um risco real, mas é regido pelo próprio tratamento de segurança de download, não pelas regras de conteúdo misto de sub-recursos desta seção. - Navegação HTTP de nível superior ainda não é conteúdo misto, incluindo o caso de link de âncora acima — isso é uma propriedade da navegação, não de um sub-recurso carregado, não importa quantas dessas outras exceções se apliquem.
Detectando conteúdo misto — toda a pilha
Não existe um único botão, e cada camada abaixo responde a uma pergunta diferente — um resultado limpo em uma camada não elimina as outras. Diagnostique fonte buscada (o que o HTML bruto realmente referencia), estado renderizado/em tempo de execução (o que o navegador solicita depois de analisar a página e executar seus scripts) e sessões reais de usuários (o que acontece para um visitante atrás de um banner de consentimento, um redirecionamento geográfico, um muro de login ou um script de terceiros que só é acionado sob condições específicas) separadamente. Sobreponha essas camadas de “uma página” a “site inteiro”:
-
O console do Chrome DevTools (estado renderizado/em tempo de execução). Carregue a página HTTPS e abra o console. Conteúdo misto ativo bloqueado registra uma mensagem como “Mixed Content: The page … was loaded over HTTPS, but requested an insecure … This request has been blocked; the content must be served over HTTPS.” (tradução) «Conteúdo misto: a página … foi carregada via HTTPS, mas solicitou um … inseguro. Esta solicitação foi bloqueada; o conteúdo deve ser servido via HTTPS.» Passivo que é carregado registra um aviso em vez de um bloqueio. O painel Security (ou a aba Issues) agrupa isso por página. Rápido para verificações pontuais e para confirmar uma correção específica — mas trate a redação exata da mensagem, o layout do painel e até mesmo quais tipos de recurso são bloqueados como específicos do navegador e da versão; isso foi confirmado no Chrome em julho de 2026 e você deve verificar a redação atual no navegador/versão real que está diagnosticando, em vez de citá-la como uma string de interface fixa, e espere que Firefox, Safari e Edge sejam diferentes.
-
Um rastreador de site (fonte buscada, em escala). DevTools é por página; um rastreamento é em todo o site. Ahrefs Site Audit e Screaming Frog sinalizam páginas que referenciam sub-recursos
http://em um site HTTPS — a única maneira realista de encontrar conteúdo misto em milhares de URLs. Esta é a principal ferramenta para uma auditoria, mas ainda está lendo a fonte: um rastreamento limpo não prova que a página renderizada ou uma sessão real também está limpa — registre qual navegador/ferramenta/versão produziu um determinado resultado em vez de relatar um único passar/falhar sem qualificação. -
Relatórios de violação de CSP (sessões reais de usuários). Você pode fazer com que os navegadores de visitantes reais relatem conteúdo misto de volta para você, o que captura recursos que só carregam em determinadas páginas, para determinados usuários, sob determinados estados de consentimento, ou de tags de terceiros que você não controla — a camada que nem um rastreamento nem uma única verificação no DevTools conseguem alcançar. web.dev: “You can use content security policy to collect reports of mixed content on your site. To enable this feature, set the
Content-Security-Policy-Report-Onlydirective by adding it as a response header for your site.” (tradução) «Você pode usar a política de segurança de conteúdo para coletar relatórios de conteúdo misto no seu site. Para ativar esse recurso, defina a diretivaContent-Security-Policy-Report-Onlyadicionando-a como um cabeçalho de resposta para o seu site.» O modo Report-Only relata violações sem aplicar a política, então você pode medir o problema em produção antes de ativar o bloqueio. (O mecanismo é o cabeçalho modernoreport-to/Reporting-Endpoints, ou o mais antigoreport-uri. Observe que esta é uma política somente de relatório diferente e de propósito geral do que o próprioupgrade-insecure-requests— colocar essa diretiva específica em modo somente de relatório não funciona, como abordado abaixo.)
Use os três: DevTools para verificar uma página renderizada, um rastreador para inventariar o código-fonte buscado, relatórios de CSP para capturar a cauda longa de sessões reais que só aparece no mundo real. Uma passagem de rastreamento é evidência sobre o código-fonte, não uma garantia de que cada estado de consentimento, variante de ad-tech, ramo de personalização ou worker esteja limpo.
Corrigindo na origem
A correção real começa antes de você tocar em uma única referência: verifique se o equivalente HTTPS realmente existe, apresenta um certificado válido e retorna o conteúdo que você espera — não presuma que trocar o esquema é seguro só porque o domínio resolve. Depois de confirmado, toda referência de sub-recurso deve resolver via HTTPS. As opções abaixo estão em ordem aproximada de preferência, mas cada uma ainda depende de titularidade e contexto, não apenas da string que você digita:
- URLs HTTPS absolutas — altere
http://cdn.example.com/app.jsparahttps://cdn.example.com/app.js. Explícito e inequívoco; o padrão mais seguro quando você não tem certeza sobre o contexto de serviço abaixo. - Caminhos relativos à raiz ou relativos — para recursos que você possui no mesmo site,
/assets/app.jsherda o esquema da página automaticamente. A orientação HTTPS do Google: “Make sure intrasite URLs and external URLs don’t depend on a specific protocol. Use relative paths or leave out the protocol as in//example.com/something.js.” (tradução) «Garanta que URLs internas e externas não dependam de um protocolo específico. Use caminhos relativos ou omita o protocolo como em//example.com/something.js.» Trate isso como condicional, não como uma recomendação universal: só se aplica depois que você confirmou que realmente possui o recurso (um caminho relativo para um ativo de terceiros não faz sentido), que a URL base real da página resolve da maneira que você espera (uma tag<base>, um caminho com proxy ou um contexto incorporado/AMP pode mudar o que “relativo” significa), e que nada downstream reconstrói a URL de uma forma que reintroduzahttp://— código no lado do cliente construindo uma URL a partir dewindow.locationou um valor absoluto armazenado, por exemplo. - URLs relativas ao protocolo (
//example.com/something.js) ainda funcionam, mas não são a correção universal preferida — condicione-as às mesmas verificações de titularidade/URL base acima, não apenas ao hábito. Em uma web totalmente HTTPS, umhttps://explícito geralmente é mais claro e evita surpresas se o arquivo for aberto em um contexto não HTTP; use relativo ao protocolo apenas onde você tiver um motivo específico para não codificar o esquema.
Em escala, você quase nunca edita modelos um a um — mas também não execute uma substituição de string não protegida no banco de dados de produção. http://yourdomain
→ https://yourdomain parece uma simples localizar e substituir, e para campos de texto simples muitas vezes é seguro, mas o conteúdo do CMS pode ser serializado ou estruturado (arrays serializados em PHP, blobs JSON, dados do editor de blocos) onde uma troca ingênua de substring corrompe o registro em vez de corrigi-lo. Use ferramentas cientes do aplicativo que entendam o formato de serialização, faça backup do banco de dados primeiro e execute um teste da substituição para que você possa revisar as linhas afetadas antes de confirmar. Em seguida, corrija o punhado de arquivos de modelo/configuração que emitem as URLs; o rastreador e os relatórios de CSP limpam os retardatários.
upgrade-insecure-requests: a rede de segurança (e seus limites)
O reforço proativo é uma diretiva de Content-Security-Policy. web.dev: “The
upgrade-insecure-requests CSP directive instructs the browser to upgrade insecure
URLs before making network requests.” Defina o cabeçalho:
Content-Security-Policy: upgrade-insecure-requestsPer MDN, it “instructs user agents to treat all of a site’s insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS).” Concretely, MDN says it upgrades: “requests to load resources (such as images, scripts, or fonts),” “navigation requests (such as link targets) which are same-origin with the document,” “navigation requests in nested browsing contexts, such as iframes,” and “form submissions.” Evidence for this claim The upgrade-insecure-requests CSP directive rewrites insecure URLs as secure URLs before requests are made. Scope: MDN documents the directive's rewriting behavior and limits; it does not guarantee that an HTTPS version of every resource exists. Confidence: high · Verified: MDN: CSP upgrade-insecure-requests
Dois detalhes operacionais importam além dessa citação. Primeiro, a atualização de sub-recursos não se limita a solicitações de mesma origem — é a atualização de navegação que é apenas de mesma origem, conforme a citação acima; solicitações comuns de sub-recursos são reescritas entre origens também, então um script hospedado em CDN ou uma fonte de terceiros é atualizado, não apenas ativos do mesmo site. Segundo, a reescrita acontece antes de o navegador avaliar as verificações de conteúdo misto e CSP, e é por isso que um recurso que de outra forma seria bloqueado diretamente como conteúdo misto pode carregar limpo depois de atualizado — a atualização antecipa o bloqueio.
Três limites que você não deve ignorar:
- Não atualiza a navegação de nível superior de terceiros. MDN: “However, top-level
navigation requests whose target is a different origin will not be upgraded.”
Por causa disso, é explicitamente não um substituto para HSTS: “The
upgrade-insecure-requestsdirective will not ensure that users visiting your site via links on third-party sites will be upgraded to HTTPS for the top-level navigation and thus does not replace theStrict-Transport-Security(HSTS) header.” (Mais sobre essa divisão abaixo.) - É uma rede, não uma correção, e não tem fallback. Se o recurso genuinamente
não estiver disponível via HTTPS, a solicitação atualizada simplesmente falha — ela
não volta para a versão original
http://. Limpar a fonte ainda é o trabalho; a diretiva cobre o que você perdeu, não o que está genuinamente quebrado. - O modo somente relatório não executa a atualização — é um no-op. Colocar
upgrade-insecure-requestsdentro de um cabeçalhoContent-Security-Policy-Report-Onlyé ignorado pelo navegador: nada é reescrito, e nada é relatado para ele também. Se você quiser visibilidade sobre o que a atualização afetaria antes de aplicá-la, execute uma política separada de somente relatório de propósito geral que relate destinoshttp://não permitidos (a mesma abordagemdefault-src https:somente relatório usada para detecção acima) — você não pode obter essa visibilidade tornando o próprioupgrade-insecure-requestssomente relatório.
block-all-mixed-content — principalmente histórico
Existe uma diretiva complementar, block-all-mixed-content, que — segundo o MDN —
“impede o carregamento de qualquer recurso por HTTP quando a página usa HTTPS,” incluindo “tanto
conteúdo misto bloqueável quanto atualizável,” e também se aplica a iframes. Na prática, ela
foi superada. O MDN a marca como obsoleta e “obsoleta na especificação,”
observando: “O conteúdo que não é bloqueado agora é sempre atualizado para uma conexão segura, então
esta diretiva não é necessária.” Recorra a upgrade-insecure-requests; trate
block-all-mixed-content como legado que você pode herdar, não algo para implantar do zero.
Se você já envia upgrade-insecure-requests, block-all-mixed-content não tem
mais nada a fazer para solicitações atualizadas — a reescrita de atualização acontece primeiro, então, quando
uma verificação de bloqueio fosse executada, a solicitação já teria sido atualizada (ou já teria
falhado). Não é apenas legado; é redundante onde quer que o UIR já esteja
implantado.
Por que seu CMS continua reintroduzindo isso
Conteúdo misto não é uma limpeza única — ele recorre, porque vários sistemas silenciosamente
reinjetam URLs http:// depois que você pensa que terminou:
- O banco de dados de conteúdo. No WordPress, Drupal e na maioria dos CMS, editores colam
imagens e incorporações com URLs absolutas
http://diretamente nos corpos das postagens. Elas ficam no banco de dados, não em um template, então uma correção no nível do código nunca as alcança — daí a busca e substituição no banco de dados. - Temas e plugins. Um tema ou plugin que codifica uma URL de recurso
http://(uma fonte, um script, uma imagem de fundo) reintroduz conteúdo misto em cada página que renderiza, e uma atualização de plugin pode trazê-lo de volta depois que você o limpou. - Tecnologia de anúncios, analytics e tags de terceiros. Gerenciadores de tags, redes de anúncios, widgets
de chat e snippets de analytics carregam seus próprios sub-recursos — e se a tag de um fornecedor
ainda chama
http://, é conteúdo misto que você não pode corrigir no seu próprio código. Este é exatamente o longo rabo que o relatório de CSP é para; a correção durável é pressionar o fornecedor a servir por HTTPS (ou remover a tag). Se um fornecedor não tem um endpoint HTTPS funcional, as escolhas duráveis são as mesmas três: fazê-lo corrigir, substituir a dependência, ou removê-la — não há uma quarta opção que mantenha a versão insegura funcionando com segurança. - Service workers e caches. Um service worker pode armazenar em cache uma resposta (ou a
própria solicitação) que ainda aponta para
http://, e continuará servindo essa referência desatualizada em visitas repetidas mesmo depois que você corrigir a fonte. Reproduza uma correção suspeita em uma sessão anônima/sem cache antes de concluir que não funcionou, e certifique-se de que uma implantação que altera URLs de recursos também aumente a versão do service worker/cache para que entradas desatualizadas sejam removidas em vez de reproduzidas. http://codificado em conteúdo antigo e templates de e-mail/impressão que são reutilizados.
A conclusão operacional: incorpore a detecção em uma auditoria recorrente (crawler + relatórios de CSP), não em uma lista de verificação de lançamento executada uma única vez.
Como o conteúdo misto interage com HSTS
Conteúdo misto e HSTS resolvem problemas adjacentes, mas diferentes, e confundi-los é um erro comum:
upgrade-insecure-requestscorrige sub-recursos que sua própria página segura solicita — ele atualiza as imagens/scripts/iframes que a página carrega.- HSTS (
Strict-Transport-Security) força a navegação de nível superior para o seu site para HTTPS — até mesmo a primeira solicitação, antes de qualquer redirecionamento — e defende contra stripping de SSL. O Google enquadra o HSTS como uma forma de “evitar o custo do redirecionamento 301” e de “derrotar ataques como SSL Stripping.”
Eles não se substituem. Como o MDN explica, upgrade-insecure-requests
“não garantirá que usuários que visitam seu site por meio de links em sites de terceiros
sejam atualizados para HTTPS na navegação de nível superior e, portanto, não substitui o
cabeçalho Strict-Transport-Security (HSTS).” Uma configuração totalmente protegida usa ambos:
upgrade-insecure-requests (ou URLs de origem limpas) para que a página segura não tenha carga
insegura, e HSTS para que ninguém alcance o site por HTTP em primeiro lugar. E o
aviso usual sobre HSTS ainda se aplica — Google: “Não ative o HSTS até ter certeza de que a
operação do seu site é robusta o suficiente para evitar a implantação de HTTPS com erros de
validação de certificado,” e o pré-carregamento é quase uma porta de mão única.
O conteúdo misto prejudica o SEO diretamente?
Comece pelos efeitos diretos, porque são os que você realmente controla: o conteúdo misto é primeiro um problema de segurança e funcionalidade. O conteúdo misto ativo bloqueado quebra a renderização e a interatividade por completo — uma folha de estilo ou script ausente é uma regressão real, independentemente do que um mecanismo de busca achar disso. Isso é motivo suficiente para corrigi-lo antes mesmo de pensar em ranqueamento.
As consequências para SEO são reais, mas condicionais, não diretas ou garantidas. A
guia oficial atual do Google não estabelece a correção de conteúdo misto como um impulso direto de
ranqueamento — o sinal de ranqueamento de HTTPS em si é baseado em esquema (se a URL começa com
https://), não uma verificação de limpeza de sub-recursos, então uma imagem insegura isolada não
custa, por si só, “o sinal de HTTPS”. Mas efeitos posteriores ainda podem aparecer
dependendo do que está realmente quebrado: se o Googlebot renderizar uma página cujo CSS ou JS foi
bloqueado como conteúdo misto, ele pode indexar uma versão quebrada ou incompleta; um indicador de
segurança rebaixado pode prejudicar a confiança do usuário, o engajamento e as conversões mesmo sem
nenhuma mudança de ranqueamento; e a preferência geral do Google por canônicos HTTPS é
ela mesma condicional — certificados inválidos, dependências inseguras,
redirecionamentos de HTTPS para HTTP ou sinais canônicos conflitantes em outros pontos da página podem
todos alterar qual URL é escolhida, independentemente do conteúdo misto especificamente. Trate
os efeitos de renderização, indexação, canonização e análise como coisas a verificar em
suas próprias páginas, não como resultados universais a prometer — e corrija o conteúdo misto pelas
razões de segurança e funcionalidade primeiro.
Isso se insere no tópico mais amplo HTTPS para SEO, que cobre o manual de migração, o peso do sinal de ranqueamento e o HSTS em detalhes; se você também estiver depurando o próprio certificado (erros de cadeia, expiração, DV/OV/EV), esse é um mergulho profundo irmão.
Resumo de IA
Uma visão condensada da versão Avançada:
- Conteúdo misto = uma página HTTPS carregando um sub-recurso via HTTP. Trata-se de recursos que a página carrega, não de links que ela contém — um link para uma página HTTP (ou qualquer navegação HTTP de nível superior) não é conteúdo misto, e um download inseguro (um limite relacionado, mas separado) também não é.
- A taxonomia atual é atualizável/bloqueável; ativo/passivo é o enquadramento mais
antigo, mas ainda útil, de raio de explosão. Ativo (scripts, folhas de
estilo, iframes,
XMLHttpRequest/fetch— qualquer coisa que o navegador execute) é bloqueado porque um script adulterado pode reescrever a página; é a regressão do dia do lançamento, corrija primeiro. Passivo (imagens, áudio, vídeo) historicamente carregava com um cadeado rebaixado e agora é cada vez mais atualizado automaticamente ou bloqueado. Exceções ao padrão geral: solicitações de imagem habilitadas para CORS falham forçadamente em vez de serem atualizadas, candidatossrcset/<picture>são bloqueáveis (não atualizáveis) comoimg srcsimples, hosts de endereço IP são bloqueados em vez de atualizados, e contextos aninhados/workers e origens locais/loopback têm suas próprias nuances. - Detecte em três camadas, não uma: fonte buscada (um rastreador como Ahrefs
Site Audit ou Screaming Frog, em todo o site), estado renderizado/em tempo de
execução (o console do Chrome DevTools/painel de Segurança, por página — a
redação exata é específica do navegador/versão, confirmada no Chrome em julho de
2026) e sessões reais de usuários (relatórios de violação de
Content-Security-Policy-Report-Only, a cauda longa de produção, incluindo tags de terceiros e recursos bloqueados por consentimento). Um resultado limpo em uma camada não limpa as outras. - Corrija na fonte, após verificar que o equivalente HTTPS realmente funciona:
aponte cada sub-recurso para
https://; caminhos relativos/relativos ao protocolo são aceitáveis apenas depois de verificar a propriedade e o comportamento real da URL base da página, não um padrão. Em escala, faça backup do banco de dados e execute uma simulação de qualquer substituição — substituição ingênua de strings pode corromper dados CMS serializados/estruturados — depois corrija os arquivos de modelo/configuração restantes. Fique atento a service workers/caches que reproduzem referênciashttp://antigas após a correção da fonte. upgrade-insecure-requests(um cabeçalho CSP) reescreve solicitações de sub-recursoshttp://no escopo — incluindo as de origem cruzada — parahttps://antes de serem enviadas e antes que as verificações de conteúdo misto/CSP sejam executadas, uma rede de segurança sem fallback HTTP se a atualização falhar. Ele não atualiza navegação de nível superior para origens de terceiros, portanto não é um substituto para HSTS, e colocar a diretiva em modo somente relatório é um no-op — monitore com uma política separada somente relatório.block-all-mixed-contentestá obsoleto/depreciado e é redundante uma vez queupgrade-insecure-requestsé implantado (a atualização é executada primeiro, então block-all não tem nada para bloquear).- Isso recorre porque o banco de dados do CMS, temas/plugins, service
workers/caches e tags de anúncios/análises continuam reintroduzindo URLs
http://— audite em um cronograma, não apenas uma vez. - O impacto no SEO é condicional, não direto: as diretrizes atuais do Google não estabelecem um ranqueamento direto a partir da correção de conteúdo misto, e o sinal HTTPS é baseado em esquema. Mas recursos ativos bloqueados podem fazer o Googlebot renderizar/indexar uma página quebrada, o rebaixamento do cadeado custa confiança, e a preferência canônica HTTPS do Google é em si condicional a coisas como validade do certificado e sinais conflitantes — não uma garantia vinculada especificamente a conteúdo misto.
Documentação oficial
Documentação de fonte primária do Google e das equipes de navegadores/padrões.
Google / web.dev
- O que é conteúdo misto? — a definição e a divisão entre ativo e passivo, com o comportamento do navegador.
- Corrigindo conteúdo misto — como encontrá-lo, corrigir URLs de sub-recursos,
upgrade-insecure-requestse relatórios de CSP. - Ative HTTPS em seus servidores — URLs relativas/relativas ao protocolo, a nota sobre
<iframe>em HTTP e orientações sobre HSTS. - Prevenir conteúdo misto é uma parte da orientação de HTTPS do Google — o guia de mudança/migração de site em que as correções de conteúdo misto se inserem.
MDN / padrões
- CSP:
upgrade-insecure-requests— o que ele atualiza, o que não atualiza e por que não substitui o HSTS. - CSP:
block-all-mixed-content— a diretiva de bloqueio obsoleta/descontinuada. - MDN — Conteúdo misto — a referência de comportamento do navegador para conteúdo bloqueável versus atualizável.
- Content Security Policy (CSP) — o cabeçalho no qual essas diretivas vivem, incluindo relatórios.
Citações da fonte
Definições registradas do web.dev do Google e da documentação de padrões da MDN. Cada link é um link profundo que salta para a passagem citada quando a plataforma oferece suporte.
Google / web.dev — o que é conteúdo misto
- “A page has mixed content when its initial HTML is loaded over a secure HTTPS connection, but other resources (such as images, videos, stylesheets, and scripts) are loaded over an insecure HTTP connection.” (tradução) «Uma página tem conteúdo misto quando seu HTML inicial é carregado por uma conexão HTTPS segura, mas outros recursos (como imagens, vídeos, folhas de estilo e scripts) são carregados por uma conexão HTTP insegura.» Fonte
- “Active mixed content poses a greater threat than passive mixed content.” (tradução) «Conteúdo misto ativo representa uma ameaça maior do que conteúdo misto passivo.» Fonte
- Conteúdo misto ativo “includes scripts, stylesheets, iframes, and any other code the browser can download and execute,” e “Most browsers already block this type of content by default to protect users.” (tradução) «inclui scripts, folhas de estilo, iframes e qualquer outro código que o navegador possa baixar e executar» e «A maioria dos navegadores já bloqueia esse tipo de conteúdo por padrão para proteger os usuários.» Fonte
- Conteúdo misto passivo, “including images, video, and audio,” “doesn’t interact with the rest of the page.” E: “Until recently, passive mixed content was loaded in all browsers, because blocking it would have broken many websites. This is now beginning to change.” (tradução) «incluindo imagens, vídeo e áudio» «não interage com o restante da página.» E: «Até recentemente, o conteúdo misto passivo era carregado em todos os navegadores, porque bloqueá-lo teria quebrado muitos sites. Isso agora está começando a mudar.» Fonte
Google / web.dev — detecção e correção
- “You can use content security policy to collect reports of mixed content on your site. To enable this feature, set the
Content-Security-Policy-Report-Onlydirective by adding it as a response header for your site.” (tradução) «Você pode usar a política de segurança de conteúdo para coletar relatórios de conteúdo misto no seu site. Para ativar esse recurso, defina a diretivaContent-Security-Policy-Report-Onlyadicionando-a como um cabeçalho de resposta para o seu site.» Fonte - “The
upgrade-insecure-requestsCSP directive instructs the browser to upgrade insecure URLs before making network requests.” (tradução) «A diretiva CSPupgrade-insecure-requestsinstrui o navegador a atualizar URLs inseguras antes de fazer solicitações de rede.» Fonte - “Make sure intrasite URLs and external URLs don’t depend on a specific protocol. Use relative paths or leave out the protocol as in
//example.com/something.js.” (tradução) «Certifique-se de que URLs internas e externas não dependam de um protocolo específico. Use caminhos relativos ou omita o protocolo, como em//example.com/something.js.» Fonte
MDN — upgrade-insecure-requests e seus limites
- “The HTTP Content-Security-Policy (CSP)
upgrade-insecure-requestsdirective instructs user agents to treat all of a site’s insecure URLs (those served over HTTP) as though they have been replaced with secure URLs (those served over HTTPS).” (tradução) «A diretivaupgrade-insecure-requestsda HTTP Content-Security-Policy (CSP) instrui os agentes de usuário a tratar todas as URLs inseguras de um site (aquelas servidas por HTTP) como se tivessem sido substituídas por URLs seguras (aquelas servidas por HTTPS).» Fonte - “However, top-level navigation requests whose target is a different origin will not be upgraded.” (tradução) «No entanto, solicitações de navegação de nível superior cujo destino seja uma origem diferente não serão atualizadas.» Fonte
- “The
upgrade-insecure-requestsdirective will not ensure that users visiting your site via links on third-party sites will be upgraded to HTTPS for the top-level navigation and thus does not replace theStrict-Transport-Security(HSTS) header.” (tradução) «A diretivaupgrade-insecure-requestsnão garantirá que usuários que visitam seu site por meio de links em sites de terceiros sejam atualizados para HTTPS na navegação de nível superior e, portanto, não substitui o cabeçalhoStrict-Transport-Security(HSTS).» Fonte
MDN — block-all-mixed-content é legado
- “The HTTP Content-Security-Policy (CSP)
block-all-mixed-contentdirective prevents loading any assets over HTTP when the page uses HTTPS.” Mas está marcada como obsoleta e “obsoleta na especificação,” porque “Content that isn’t blocked is now always upgraded to a secure connection, so this directive is not needed.” (tradução) «Conteúdo que não é bloqueado agora é sempre atualizado para uma conexão segura, então esta diretiva não é necessária.» Fonte
Lista de verificação de conteúdo misto
Execute isto durante e após uma migração HTTP→HTTPS e, em seguida, de forma recorrente:
Encontre
- Carregou os principais modelos (início, produto, artigo, checkout) por HTTPS com o console do Chrome DevTools aberto e anotou cada mensagem de “Mixed Content”.
- Executou um crawl completo (Ahrefs Site Audit ou Screaming Frog) e extraiu a lista
de páginas que referenciam sub-recursos
http://. - Configurou
Content-Security-Policy-Report-Onlycom um endpoint de relatório para capturar a cauda longa de produção (por usuário, por página e tags de terceiros).
Corrija (ativo primeiro)
- Todas as referências ativas corrigidas:
<script>,<link rel="stylesheet">,<iframe>,fetch/XMLHttpRequest, fontes — estas são bloqueadas, então quebram a página. - Todas as referências passivas corrigidas:
<img>,<audio>,<video>e seus URLs de<source>/poster. - Substituição no banco de dados do CMS (
http://yourdomain→https://yourdomain) para conteúdo colado — com backup, teste em seco com ferramentas cientes do aplicativo, não uma substituição bruta de string em campos serializados/estruturados. - URLs de ativos
http://codificados no tema/plugin encontrados e corrigidos. - Entradas de service worker/cache reproduzidas em uma sessão sem cache, e a
versão do cache/service worker incrementada para que referências
http://obsoletas não sejam reproduzidas. - Tags de terceiros (anúncios, analytics, chat, embeds) confirmadas para carregar por HTTPS — ou o fornecedor enviou / a tag foi removida.
Proteção e verificação
- Cabeçalho
Content-Security-Policy: upgrade-insecure-requestsdefinido como rede de segurança (entendendo que ele não substitui HSTS). - Re-executou o crawl e re-verificou o console — zero recursos ativos bloqueados, cadeado limpo nas páginas verificadas.
- Detecção de conteúdo misto adicionada à auditoria recorrente, não apenas à lista de verificação de lançamento (atualizações de plugins e novo conteúdo reintroduzem isso).
Qual correção este caso de conteúdo misto precisa?
Trabalhe a partir do sintoma.
O item inseguro é um recurso que a página carrega ou um link que a página contém?
- Um link (
<a href="http://…">) → não é conteúdo misto. Deixe-o (opcionalmente aponte-o para HTTPS para limpeza dos dados de referência). Pare aqui. - Um recurso carregado (script, estilo, iframe, imagem, fonte, mídia,
fetch) → continue.
O recurso está disponível via HTTPS?
- Sim, e você verificou (certificado válido, retorna o conteúdo pretendido) →
altere a referência para
https://(o padrão seguro), ou um caminho relativo / relativo ao protocolo somente se você for o dono do recurso e tiver verificado o comportamento da URL base da página. Esta é a correção real. Concluído. - Não / não tem certeza → é próprio (seu próprio ativo)?
- Próprio → sirva-o via HTTPS (é o seu servidor; você pode). Depois corrija a referência como acima.
- De terceiros (tag de fornecedor, anúncio, incorporação) → peça ao fornecedor um endpoint HTTPS;
se ele não tiver um, substitua ou remova a tag.
upgrade-insecure-requeststentará atualizá-lo, mas se o fornecedor não tiver versão HTTPS, a solicitação atualizada simplesmente falha.
É ativo ou passivo?
- Ativo (script / folha de estilo / iframe /
fetch/ fonte) → prioridade máxima — está bloqueado, então a página fica funcionalmente quebrada até você corrigir. - Passivo (imagem / áudio / vídeo) → corrija também, mas é menos urgente (rebaixamento do cadeado / possível bloqueio futuro, não uma quebra imediata).
Você quer uma rede de segurança para o que você perdeu?
- Defina
Content-Security-Policy: upgrade-insecure-requests. Lembre-se: rede, não substituto — e não cobre navegação de nível superior de terceiros, então não é um substituto para HSTS.
Você também precisa forçar a página de nível superior para HTTPS para referências de primeira vez / de terceiros?
- Isso é HSTS, um controle separado. Adicione
Strict-Transport-Security— mas somente quando sua operação de certificado estiver sólida, porque HSTS (especialmente preload) é quase uma porta de mão única.
Os modelos mentais
1. Recursos, não links. Conteúdo misto é sobre o que a página segura carrega, nunca sobre para onde ela linka. Se você não conseguir decidir se algo conta, pergunte: o navegador busca isso para construir a página atual? Sim → possível conteúdo misto. Apenas me leva a outra página → não é conteúdo misto.
2. Faça a triagem pelo que o navegador faz, não pela gravidade no abstrato. Ativo (scripts, estilos, iframes) é bloqueado → é um bug funcional, corrija primeiro. Passivo (imagens, mídia) é avisado/atualizado → corrija depois. O próprio comportamento do navegador é sua fila de prioridades.
3. A detecção é um funil: verifique → inventarie → capture a cauda. Console do DevTools (uma página, exato), rastreador (site inteiro, o grosso), relatórios CSP (produção, terceiros, cauda longa por usuário). Nenhuma ferramenta vê todos os três.
4. Corrija a fonte; cubra o resto.
Limpe as URLs reais — banco de dados, modelos, tags. Depois adicione
upgrade-insecure-requests como uma proteção para o que escapar. A diretiva é
seguro, não um reparo.
5. Dois trabalhos diferentes de “forçar HTTPS”, duas ferramentas diferentes.
upgrade-insecure-requests atualiza os sub-recursos que sua página segura solicita.
HSTS força a navegação de nível superior para seu site para HTTPS. Eles não se
sobrepõem e um nunca substitui o outro — um site endurecido usa ambos.
6. É uma auditoria recorrente, não uma tarefa única.
O banco de dados do CMS, atualizações de plugins/temas e tags de terceiros continuam reintroduzindo
http://. Trate a detecção como uma varredura agendada, ou ela volta silenciosamente.
Anti-padrões de conteúdo misto
Erros que deixam conteúdo inseguro ativo — ou o encobrem em vez de corrigi-lo.
- Tratar
upgrade-insecure-requestscomo a correção. É uma rede. Se o recurso não tiver versão HTTPS, a solicitação atualizada falha, e você escondeu uma dependência quebrada em vez de resolvê-la. Limpe as URLs de origem; use a diretiva para o restante. - Presumir que um deploy de código limpou o banco de dados. Em um CMS, a maioria das URLs de imagem e
incorporação
http://vive em linhas de conteúdo, não em templates. Uma correção de template deixa cada post antigo misto. Execute a busca e substituição no banco de dados. - Despriorizar conteúdo misto ativo porque “é só um aviso.” Não é — ativo é bloqueado. Uma folha de estilo ou script bloqueado é uma interrupção funcional, não um incômodo cosmético.
- Verificar a página inicial e considerar concluído. Conteúdo misto se esconde em páginas de produto, posts antigos de blog e caminhos que apenas alguns usuários acessam. Rastreie o site inteiro e use relatórios de CSP para o que o rastreamento não alcança.
- Ignorar tags de terceiros. Um fornecedor de anúncios, analytics ou chat que ainda chama
http://é conteúdo misto que você não pode corrigir no seu próprio repositório. Perseguir isso no seu código para sempre é esforço desperdiçado — pressione o fornecedor ou remova a tag. - Usar
block-all-mixed-contentem uma nova build. Está obsoleto e descontinuado. Useupgrade-insecure-requestsem vez disso. - Confundir
upgrade-insecure-requestscom HSTS. Um atualiza sub-recursos; o outro força HTTPS de nível superior e defende contra stripping de SSL. Enviar um e presumir que você cobriu o outro deixa uma lacuna real. - Deixar a detecção fora da auditoria recorrente. Corrigir uma vez e nunca verificar
novamente garante que uma atualização de plugin ou uma imagem
http://colada traga de volta despercebido.
Conteúdo misto — folha de referência
Ativo vs. passivo
| Tipo | Recursos de exemplo | Comportamento do navegador | Prioridade |
|---|---|---|---|
| Ativo | <script>, <link rel="stylesheet">, <iframe>, fetch/XMLHttpRequest, fontes, <object> | Bloqueado — quebra a página | Corrigir primeiro |
| Passivo | <img>, <audio>, <video> e suas fontes | Avisa / rebaixa o cadeado; cada vez mais atualizado automaticamente ou bloqueado | Corrigir em seguida |
Link de âncora <a href="http://…"> | (uma navegação, não um sub-recurso) | Não é conteúdo misto | N/A |
Pilha de detecção
| Camada | Ferramenta | Vê |
|---|---|---|
| Por página | Console do Chrome DevTools / painel de Segurança | Recursos exatos bloqueados e avisados na página aberta |
| Site inteiro | Ahrefs Site Audit, Screaming Frog | Cada página referenciando sub-recursos http:// |
| Cauda de produção | Content-Security-Policy-Report-Only + endpoint de relatório | Violações por usuário, por página e de tags de terceiros |
As diretivas de CSP
| Diretiva | O que faz | Status |
|---|---|---|
upgrade-insecure-requests | Reescreve solicitações de sub-recursos http:// no escopo para https:// antes de enviar | Atual — a que usar |
block-all-mixed-content | Bloqueia todos os ativos HTTP em uma página HTTPS | Obsoleta / descontinuada |
Content-Security-Policy-Report-Only | Relata violações sem aplicar | Atual — use para medir primeiro |
Não-confunda-estes
| Corrige | Escopo | |
|---|---|---|
upgrade-insecure-requests | Sub-recursos que a página segura carrega | Mesma origem + no escopo; não navegação de nível superior de terceiros |
HSTS (Strict-Transport-Security) | Navegação de nível superior para seu site | Força HTTPS mesmo na primeira solicitação; não é uma correção de conteúdo misto |
Correção rápida (CMS): busca e substituição no banco de dados http://yourdomain → https://yourdomain, depois corrija templates/plugins e, em seguida, defina upgrade-insecure-requests.
Encontre conteúdo misto — trechos
1. Rastreie uma página pela linha de comando
Pegue uma página e sinalize qualquer sub-recurso src/href inseguro deixado no HTML.
macOS / Linux
# Flag insecure script/img/link/iframe/source references on a single URL
curl -s https://example.com/ \
| grep -Eo '(src|href)="http://[^"]+"' \
| sort -uWindows (PowerShell)
(Invoke-WebRequest -Uri "https://example.com/").Content `
| Select-String -Pattern '(src|href)="http://[^"]+"' -AllMatches `
| ForEach-Object { $_.Matches.Value } | Sort-Object -UniqueIsso só vê o HTML bruto — recursos injetados por JavaScript não aparecem, o que é exatamente por que você também usa o DevTools e um crawler real.
2. Console do Chrome DevTools — liste recursos inseguros na página renderizada
Cole no console na página HTTPS para capturar até referências inseridas por JS:
// Every element with an http:// resource attribute in the live DOM
[...document.querySelectorAll('[src],[href],[srcset],[data-src]')]
.filter(el => /^http:\/\//.test(
el.src || el.href || el.getAttribute('srcset') || el.getAttribute('data-src') || ''
))
.map(el => ({ tag: el.tagName, url: el.src || el.href }));O navegador também registra conteúdo misto ativo bloqueado por conta própria como
Mixed Content: … This request has been blocked; the content must be served over HTTPS. — leia esses primeiro.
3. Bookmarklet — despejo de console com um clique
Salve como favorito; clique em qualquer página HTTPS para registrar no console suas
referências http://:
javascript:(()=>{const h=[...document.querySelectorAll('[src],[href]')].filter(e=>/^http:\/\//.test(e.src||e.href)).map(e=>e.src||e.href);console.log('%cMixed content candidates:','font-weight:bold',h.length);h.forEach(u=>console.log(u));})();4. Ative o relatório de CSP (detecte em produção)
Adicione um cabeçalho somente de relatório para que os navegadores dos visitantes reais informem violações — incluindo tags de terceiros e páginas que seu rastreamento não encontra:
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-report-endpointSomente relatório relata sem aplicar, para que você possa dimensionar o problema
com segurança antes de ativar upgrade-insecure-requests ou a aplicação. (O
equivalente moderno usa report-to com um cabeçalho Reporting-Endpoints.)
5. O cabeçalho de rede de segurança (depois de corrigir a origem)
Content-Security-Policy: upgrade-insecure-requestsLembre-se de que ele não atualiza a navegação de nível superior de terceiros e não substitui o HSTS.
SOP recorrente de auditoria de conteúdo misto
Execute isso após lançamentos de HTTPS, versões de CMS ou temas, mudanças no gerenciador de tags e em um cronograma regular para sites cujo conteúdo muda com frequência.
- Rastreie páginas HTTPS em modos bruto e renderizado. Exporte URLs inseguras de
src,srcset, folha de estilo, iframe, mídia e solicitações fetch/XHR; links de âncora HTTP comuns não são conteúdo misto. - Colete evidências do navegador. Revise o DevTools em modelos representativos e
use
Content-Security-Policy-Report-Onlypara capturar violações acionadas por visitantes reais e tags de terceiros. - Classifique cada descoberta. Marque-a como ativa ou passiva, de primeira parte ou de terceiros, estática ou injetada por JavaScript, e identifique o modelo, campo de banco de dados, plugin, tag ou fornecedor que é dono da origem.
- Corrija a referência de origem. Aponte-a para um recurso HTTPS funcional ou
uma URL relativa segura. Não presuma que mudar
http://parahttps://é suficiente; verifique se o destino realmente suporta TLS. - Use CSP como rede de segurança. Adicione
upgrade-insecure-requestssomente após revisar as descobertas. Isso pode reduzir a exposição, mas não repara o registro do CMS nem substitui o HSTS. - Rastreie e renderize novamente. Erros de conteúdo misto ativo devem ser zero nos modelos testados; recursos passivos também devem resolver via HTTPS sem fallback.
- Evite recorrência. Corrija o modelo de origem ou o fluxo de trabalho do editor, mantenha a coleta somente de relatório quando apropriado e atribua novas violações ao dono do sistema.
Sintoma → causa provável → correção
| Sintoma | Causa provável | O que inspecionar | Correção |
|---|---|---|---|
| A página perde o layout ou a interação após a ativação do HTTPS | Conteúdo ativo bloqueado, geralmente uma folha de estilo, script, iframe ou solicitação fetch | Erros do Console e de Rede do DevTools no template afetado | Mova o recurso para uma URL HTTPS válida e corrija o template ou a tag de origem |
| O cadeado ou o indicador de segurança é rebaixado enquanto a página ainda parece utilizável | Imagem passiva, áudio, vídeo ou outro conteúdo atualizável | DOM renderizado, srcset, atributos de carregamento preguiçoso, CSS e avisos do navegador | Substitua toda referência de recurso insegura e verifique se o ativo HTTPS retorna com sucesso |
| O problema retorna após uma versão do CMS | Uma URL HTTP absoluta permanece no banco de dados, tema, plugin ou conteúdo gerado | Compare novas violações por template e implantação; pesquise campos armazenados e configuração | Corrija o gerador ou o valor armazenado e, em seguida, faça o backfill do conteúdo afetado |
| O rastreamento está limpo, mas usuários reais ainda relatam falhas | JavaScript, lógica de consentimento, ad tech ou uma tag de terceiros injeta a solicitação apenas em tempo de execução | Eventos de CSP somente relatório e DevTools com o estado de consentimento/dispositivo relevante | Altere ou remova a tag/configuração do fornecedor responsável e teste novamente esse estado |
upgrade-insecure-requests está presente, mas um recurso ainda falha | A origem HTTP não tem equivalente HTTPS funcional, ou a política não cobre essa navegação | URL final da solicitação atualizada, certificado e resposta | Hospede o ativo em HTTPS ou substitua-o; não trate a diretiva como um proxy |
Testes de versão de conteúdo misto
Teste 1: varredura de template renderizado
- Objetivo: Capturar recursos ativos e passivos que o HTML bruto sozinho não detecta.
- Método: Renderize uma URL representativa de cada template e estado de interação; inspecione a saída do Console e da Rede em busca de solicitações inseguras ou bloqueadas.
- Resultado esperado: Nenhum sub-recurso é solicitado via HTTP e nenhum conteúdo ativo é bloqueado.
- Gatilho de falha: Qualquer aviso de conteúdo misto, falha de atualização automática ou layout/função ausente causado por um recurso bloqueado.
- Próxima ação: Rastreie a solicitação até seu template, tag, plugin ou campo armazenado; corrija a origem e execute novamente a varredura.
Teste 2: comparação de origem e CSP
- Objetivo: Detectar violações introduzidas apenas para visitantes reais ou por terceiros.
- Método: Compare os resultados do rastreador com eventos de
Content-Security-Policy-Report-Only, agrupados por URL bloqueada, template de página, diretiva e proprietário. - Resultado esperado: Nenhuma violação inexplicável apenas em produção permanece; ruído conhecido é documentado e excluído de forma restrita.
- Gatilho de falha: Uma violação repetível ausente no rastreamento ou uma fonte de terceiros sem proprietário.
- Próxima ação: Reproduza o estado do visitante e corrija ou remova a integração injetora.
Teste 3: teste de recorrência após a publicação
- Objetivo: Verificar se o CMS não gera mais novas referências inseguras.
- Método: Publique um item de teste pelo fluxo de trabalho editorial normal e, em seguida, rastreie e renderize-o com as mesmas verificações usadas para produção.
- Resultado esperado: A marcação gerada e os recursos carregados usam URLs HTTPS válidas.
- Gatilho de falha: A nova página recria uma referência HTTP anteriormente limpa de conteúdo mais antigo.
- Próxima ação: Corrija o padrão do editor, template, plugin ou transformação de conteúdo antes que a versão prossiga.
Recursos que valem seu tempo
Minhas palestras
- Better Safe Than Sorry with HTTPS — SMX East 2016 (SlideShare) — meu mergulho profundo em TLS, falhas comuns de implementação de HTTPS e as armadilhas de migração que produzem conteúdo misto em primeiro lugar. (Aviso permanente: é meu entendimento desses sistemas, e as estatísticas de adoção nele são de 2016.)
Meus escritos relacionados
- The Beginner’s Guide to Technical SEO — onde HTTPS e conteúdo misto se encaixam no panorama técnico mais amplo.
Do setor
- O que é conteúdo misto? (web.dev / Google) — a definição canônica e a divisão entre ativo e passivo.
- Corrigindo conteúdo misto (web.dev / Google) — o passo a passo: encontrá-lo, corrigir URLs de sub-recursos,
upgrade-insecure-requestse relatórios de CSP. - MDN —
upgrade-insecure-requests— exatamente o que ele atualiza, o que não atualiza e por que não substitui o HSTS. - MDN —
block-all-mixed-content— a diretiva de bloqueio obsoleta, para quando você a herdar. - MDN — Conteúdo misto — a referência de comportamento do navegador para recursos bloqueáveis versus atualizáveis.
- Ative HTTPS em seus servidores (web.dev / Google) — URLs relativas/relativas a protocolo e as orientações de configuração de HTTPS ao redor.
Estatísticas que valem citar
- Conteúdo misto ativo é bloqueado por padrão. Google: “Most browsers already block this type of content by default to protect users.” (tradução) «A maioria dos navegadores já bloqueia esse tipo de conteúdo por padrão para proteger os usuários.» — o motivo pelo qual o conteúdo misto ativo é uma interrupção funcional, não um aviso. Fonte
- Conteúdo misto ativo é a maior ameaça. A própria classificação do Google dos dois níveis: “Active mixed content poses a greater threat than passive mixed content.” (tradução) «Conteúdo misto ativo representa uma ameaça maior do que conteúdo misto passivo.» — dimensiona corretamente sua ordem de triagem. Fonte
- Conteúdo misto passivo não é mais “permitido” com segurança. Google: “Until recently, passive mixed content was loaded in all browsers … This is now beginning to change.” (tradução) «Até recentemente, conteúdo misto passivo era carregado em todos os navegadores … Isso agora está começando a mudar.» — a suposição de que “imagens são inofensivas” está expirando. Fonte
upgrade-insecure-requestsnão substitui o HSTS. O MDN afirma claramente: ele “does not replace theStrict-Transport-Security(HSTS) header.” (tradução) «não substitui o cabeçalhoStrict-Transport-Security(HSTS).» — os dois controles resolvem metades diferentes do problema. Fonte- ~89% da web está em HTTPS (W3Techs, 2026; confirme o número atual), o que
é exatamente o motivo pelo qual sub-recursos
http://remanescentes em uma página de outra forma segura são o modo de falha comum agora — as páginas estão em HTTPS; a carga fica para trás. Contexto via o hub de HTTPS.
Teste-se: Conteúdo misto
Cinco perguntas rápidas sobre conteúdo misto. Escolha uma resposta para cada uma e depois confira.
Registro de alterações
Atualizado em 17 de jul. de 2026.
Resumo editorial e detalhes registrados da alteração.Detalhes da alteração
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.