Artigo

19 de set. de 2025

Como detectamos e neutralizamos um caso de piggyback usando GTM + GA4

Detectamos que alguém estava piggybacking nosso container e criamos um detector com Google Tag Manager + GA4, relatório exploratório e alertas automáticos. Guia prático com código e checklist.

cientist ga4 gtm
cientist ga4 gtm
cientist ga4 gtm

Contexto rápido

Detectamos tráfego e eventos vindo de um domínio externo (hipotético https://site-exemplo-falso.com) que estava disparando nosso GTM/GA4 — ou seja, alguém “pegou” nosso código e estava executando tags em outro site (piggyback). A investigação começou pelo relatório de Páginas no GA4 — encontramos um título/URL inesperado que levou até o host suspeito.

Abaixo está o passo a passo técnico que usamos para detectar, validar e gerar alerta sempre que isso acontecer.

1) Diagnóstico inicial (onde vimos o problema)

  • Relatório: GA4 → Engagement → Pages and screens (Páginas e telas)

    • Vimos um título/URL com visualizações que não batiam com nosso site.

    • Ao checar hostnames no GTM Preview / Tag Assistant encontramos site-exemplo-falso.com aparecendo em eventos.

  • Objetivo: criar um detector automático que envie evento host_suspeito para GA4 e dispare um alerta por e-mail/webhook.

2) Variável no GTM — capturar hostname real (Custom JS)

Criamos uma variável do tipo Custom JavaScript que retorna o hostname atual do container (ou do dataLayer quando enviado pelo site invasor). Nome: hostname.

function() {
  // Retorna primeiro um valor presente no dataLayer (se existir)
  try {
    var dl = window.dataLayer || [];
    for (var i = dl.length - 1; i >= 0; i--) {
      var item = dl[i];
      if (item && item.hostname) return item.hostname;
      if (item && item.page_hostname) return item.page_hostname;
    }
  } catch(e){}

  // Se não houver no dataLayer, volta para document.location.hostname
  return document.location && document.location.hostname ? document.location.hostname : '';
}

Observação: esse formato prioriza valores empurrados no dataLayer (útil nos nossos testes quando simulávamos dataLayer.push({ hostname: 'sitefalso.com' })), e cai em document.location.hostname se não houver dado explícito.

3) Trigger de verificação — “host válido” e “host suspeito”

Criamos dois gatilhos principais:

a) Trigger Host válido (Page View)

  • Tipo: Page View (ou Initialization se quiser bloquear antes de tudo)

  • Condição (Some Page Views): JS - Hostname matches RegEx

    Regex (exemplo):

^(www\.)?(adrock\.com\.br|app\.leadster\.com\.br)

(adeque os domínios confiáveis do seu ecossistema)

Esse trigger é usado no GA4 - Pageview principal (só dispare pageview normal quando hostname for válido).

b) Trigger Host suspeito (Custom Event)

  • Tipo: Custom Event

  • Event name: host_suspeito

  • This trigger fires on: All Custom Events (se preferir, use Some Custom Events com regex)

  • Alternativa: também podemos criar um trigger que dispare quando JS - Hostname does not match RegEx (se desejar detectar automaticamente sem dependência de dataLayer.push):

Ex.: Trigger tipo Page View com condição:

JS - Hostname does not match RegEx ^(www\.)?(adrock\.com\.br|app\.leadster\.com\.br)

4) Tag GA4 para registrar o evento host_suspeito

Criamos uma tag do tipo Google Analytics: GA4 Event:

  • Measurement ID: use sua config (ou variável {{GA4 - TAG}})

  • Event name: host_suspeito

  • Event parameters:

    • hostname: {{hostname}}  ← nossa variável Custom JS

    • page_location: {{Page URL}}  (variável URL do GTM)

    • outros parâmetros que achar úteis (referrer, client_id, etc.)

Triggering: vincular à trigger Host suspeito (ou ao Custom Event host_suspeito).

5) Como simular o ataque / testar via Console

Do console do Chrome (#DevTools) execute:

Opção A — empurrando hostname diretamente:

dataLayer.push({
  event: 'host_suspeito',
  hostname: 'site-exemplo-falso.com',
  page_location: 'https://site-exemplo-falso.com/test'
});

Opção B — usando page_hostname (algumas implementações usam esse nome):

dataLayer.push({
  event: 'host_suspeito',
  page_hostname: 'site-exemplo-falso.com',
  page_location: 'https://site-exemplo-falso.com/test'
});

Importante: o preview do GTM mostrará o evento. Para o GA4 aparecer no DebugView, verifique:

  • Tag GA4 configurada corretamente (medição encontrada no container)

  • O evento host_suspeito foi enviado (DebugView deve mostrar o evento com os parâmetros).

Se não aparecer no DebugView, verifique o Measurement ID e se existe algum bloqueio de consentimento.

6) Relatório exploratório no GA4 (Exploration)

Crie uma Exploração para monitorar:

  • Dimensão: hostname (ou use event parameter hostname)

  • Métrica: Event count

  • Filtro: event name = host_suspeito

  • Adicione page_location, event_time, user_country como colunas

Ou no relatório padrão: Engagement → Events, clique em host_suspeito e explore parâmetros.

7) Alerta por e-mail / webhook (opcional, recomendado ainda validando isso…)

No GTM criamos uma tag Custom HTML / HTTP Request que chama um webhook quando host_suspeito dispara. Exemplo:

Tag: Custom HTML (ou Fetch/Beacon via Tag template)

<script>
  (function(){
    var payload = {
      event: 'host_suspeito',
      hostname: '{{hostname}}',
      page_location: '{{Page URL}}',
      reported_at: new Date().toISOString()
    };

    // Exemplo: chamar webhook (servidor que encaminha por e-mail)
    fetch('https://hooks.example.com/adrock-alert', {
      method: 'POST',
      headers: {'Content-Type':'application/json'},
      body: JSON.stringify(payload)
    }).catch(function(e){console.warn('alert webhook failed', e)});
  })();
</script>

No nosso caso usamos um webhook que dispara um e-mail para a equipe com prints e dados (pode ser um Azure Function, Netlify Function, Make/Integromat ou AWS Lambda que faz envio via SMTP/SES).

Trigger: Host suspeito.

8) Ajustes finais que fizemos (resumo prático)

  1. Criamos hostname (Custom JS) que prioriza dataLayer e fallback em document.location.hostname.

  2. Criamos trigger de validação com regex contendo todos os hosts confiáveis.

  3. Criamos um trigger separado para suspeito (ou um evento customizado).

  4. Criamos tag GA4 que registra host_suspeito com parâmetros.

  5. Simulamos via console (dataLayer.push(...)) para validar GTM Preview e GA4 DebugView.

  6. Adicionamos tag webhook para alertas imediatos por e-mail.

  7. Publicamos mudanças (workspace → submit / publish) e monitoramos.

9) Código/regex usados (recapitulando)

  • Regex hosts confiáveis (exemplo):

^(www\.)?(adrock\.com\.br|app\.leadster\.com\.br)
  • Custom JS variable (já mostrado acima).

  • dataLayer.push de teste:

dataLayer.push({
  event: 'host_suspeito',
  hostname: 'site-exemplo-falso.com',
  page_location: 'https://site-exemplo-falso.com/test'
});
  • Payload do webhook (exemplo JSON):

{
  "event":"host_suspeito",
  "hostname":"site-exemplo-falso.com",
  "page_location":"https://site-exemplo-falso.com/test",
  "reported_at":"2025-09-18T12:00:00Z"
}

10) Checklist rápido (para replicar)

  • Criar variável hostname (Custom JS) com fallback.

  • Definir lista de domínios confiáveis e montar regex.

  • Criar trigger Host válido (Page View) usando regex.

  • Criar trigger Host suspeito (Custom Event / Page View not match).

  • Criar Tag GA4 Event host_suspeito com parâmetros (hostname, page_location).

  • Criar tag Webhook (ou Custom HTML) para enviar alerta por e-mail.

  • Testar com dataLayer.push(...) em modo Preview / Tag Assistant.

  • Publicar container e monitorar GA4 DebugView + Exploration.

11) Observações e boas práticas

  • Publicar com cuidado: mudanças em triggers de pageview podem afetar contagem de pageviews; prefira testar em ambiente de staging e usar Initialization quando precisar bloquear cedo.

  • Consentimento: se seu site usa consent mode, verifique se tags e webhooks respeitam leis locais (LGPD/GDPR).

  • Auditoria periódica: rode relatórios semanais do evento host_suspeito e mantenha um playbook de resposta.

  • Bloqueio técnico: além de detectar, considere renegar tokens/credentials expostos, trocar secrets e avaliar cláusulas contratuais com fornecedores que possam ter exposto o código.

Conclusão / CTA

Transformamos uma detecção curiosa no GA4 em um fluxo robusto de defesa: detecção (GTM)registro (GA4)alerta (webhook / e-mail).

Se quiser que a equipe da Ad Rock faça a implantação completa em seus clientes (ajustando regex, relatórios e webhook), a gente se encarrega de automatizar, documentar e entregar o runbook. 😎

Compartilhe!

Deixe a IA fazer o trabalho para Você Crescer Mais Rápido

Agende uma conversa hoje e comece a automatizar.

Deixe a IA fazer o trabalho para Você Crescer Mais Rápido

Agende uma conversa hoje e comece a automatizar.

© 2010 - 2025 Copyright

All Rights Reserved - Develop by Ad Rock Digital Mkt

© 2010 - 2025 Copyright

All Rights Reserved - Develop by
Ad Rock Digital Mkt