Ilustração sobre segurança do tema WordPress e revisão de código antes de replicar em vários sites

Segurança do tema WordPress: o que revisar antes de replicar

Resposta rápida desse conteúdo

Checklist rápido de segurança do tema

9 minutos de leitura

Índice de conteúdo

Você replicou o mesmo tema em cinco clientes e, semanas depois, um deles aparece com redirecionamento estranho. O tema é o mesmo em todos. Antes de culpar o plugin, olhe para o pacote que você instalou: a segurança do tema WordPress é a camada que quase ninguém audita, porque o tema “é só o visual”. Não é. O tema roda código PHP com os mesmos privilégios do core, e um único functions.php mal escrito abre porta para injeção, upload indevido e execução remota.

Aqui a ordem de verificação é do tema, não do site. Origem do pacote, funções de escape na saída, uso de eval e base64, chamadas de admin-ajax sem nonce e scripts carregados de CDN externa. Depois, o recorte de quem replica: o que se checa uma vez no tema-base e o que precisa ser rechecado em cada site.

Por que a segurança do tema WordPress é o elo esquecido

Plugins têm tela de atualização, aviso de vulnerabilidade e changelog. Tema costuma ser instalado uma vez e esquecido. Por isso, um tema WordPress vulnerável pode ficar anos no ar sem ninguém notar. Além disso, tema pago comprado em site de terceiros, o famoso nulled, é o vetor mais comum de backdoor em sites pequenos. O pacote vem com o código original mais uma linha a mais, geralmente ofuscada.

Quando você replica o mesmo tema em vários clientes, o problema se multiplica. Uma falha no tema-base vira cinco sites comprometidos na mesma semana. Por isso a revisão de segurança do tema WordPress precisa acontecer antes da replicação, não depois do incidente.

Ordem de verificação do próprio tema

Siga esta sequência. Ela vai do mais fácil de checar ao mais profundo, e cada etapa elimina um tipo de risco.

1. Origem do pacote

Antes de qualquer análise de código, confirme de onde veio o arquivo. Baixe direto do repositório oficial ou do site do desenvolvedor, com licença e nota fiscal. Se o tema é pago e você recebeu por grupo de Telegram, pasta compartilhada ou site de “download grátis”, trate como comprometido até prova em contrário.

Um teste rápido: compare o style.css do pacote com o do repositório oficial. Diferença de versão, autor ou Theme URI é sinal de pacote alterado. Na prática, tema nulled costuma vir com uma versão levemente acima da oficial, para parecer atualizado.

2. Escape na saída

Abra o tema e procure por echo e print que imprimem variável direto, sem função de escape. O correto é usar esc_html(), esc_attr(), esc_url() ou wp_kses_post() na saída. Sem isso, qualquer campo que o usuário controla (comentário, título de post, parâmetro de URL) pode injetar HTML e script.

O padrão que denuncia problema é este:

echo $_GET['msg'];

O correto seria echo esc_html( $_GET['msg'] );. A documentação oficial do WordPress explica cada função de escape e quando usar: developer.wordpress.org/apis/security/. Vale ler antes de revisar, porque a lista é longa e o contexto importa.

3. eval, base64 e ofuscação

Procure por eval(, base64_decode(, gzinflate(, str_rot13( e create_function(. Tema legítimo quase nunca usa isso. Quando usa, geralmente é para esconder código malicioso. Um bloco de string longa em base64 dentro do functions.php é o padrão clássico de backdoor.

Se encontrar, não apague na hora. Copie o arquivo, decodifique em ambiente isolado e veja o que o código faz. Só depois remova. Apagar sem entender pode deixar um gancho ativo em outro arquivo.

4. admin-ajax sem nonce

Funções registradas em wp_ajax_ e wp_ajax_nopriv_ são acessíveis por qualquer visitante. Se o tema registra uma ação que grava opção, cria usuário ou envia e-mail sem verificar nonce, você tem um vetor de abuso direto. O padrão correto é check_ajax_referer() ou wp_verify_nonce() no início do callback.

Procure por add_action( 'wp_ajax_nopriv_ no tema. Cada ocorrência merece leitura do callback. Se não houver verificação de nonce e a ação altera dados, é falha grave.

5. Scripts de CDN externa

Tema que carrega jQuery, Font Awesome ou qualquer biblioteca de CDN sem versão fixa e sem integrity aceita o que o CDN entregar. Se o CDN for comprometido ou o domínio expirar, o script que roda no seu site é outro. Prefira os scripts já empacotados no core do WordPress ou hospede localmente.

Verifique também se o tema enfileira scripts com wp_enqueue_script() ou se injeta <script> direto no header.php. O segundo caso dificulta controle e cache.

O que checar uma vez e o que rechecar em cada site

Quem replica tema em vários clientes precisa separar o que é auditoria de tema-base do que é auditoria de site. Misturar os dois faz você refazer trabalho ou, pior, deixar passar algo específico.

Item Frequência Por quê
Origem do pacote Uma vez, no tema-base O arquivo é o mesmo em todos os sites
eval, base64, ofuscação Uma vez, no tema-base Código malicioso no pacote afeta todos
Escape na saída Uma vez, no tema-base Falha estrutural do tema, não do site
admin-ajax sem nonce Uma vez, no tema-base Registro é do tema, não do site
CDN externa Uma vez, no tema-base Dependência declarada no tema
functions.php do child A cada site Cada cliente tem customização própria
Plugins que estendem o tema A cada site Combinação varia por projeto
Usuários com permissão de editar tema A cada site Quem pode editar código muda por cliente

O ponto crítico é o functions.php do child. Ele roda depois do tema pai e pode reabrir um buraco que o pai já tinha fechado. Por exemplo: o tema-base usa esc_html() em um campo, e o child sobrescreve o template com echo direto. A auditoria do tema-base passou, mas o site continua exposto. Por isso, revisar tema antes de instalar não termina no pacote: termina no child de cada cliente.

Como diagnosticar na prática

Você não precisa de ferramenta paga para a primeira passada. Acesso ao arquivo do tema já resolve a maior parte.

  1. Baixe o tema e descompacte em ambiente local. Nunca analise direto no servidor de produção.
  2. Rode uma busca por eval, base64_decode, gzinflate, str_rot13 e create_function em todos os arquivos .php.
  3. Busque por echo $_ e print $_ para achar saída sem escape.
  4. Busque por wp_ajax_nopriv_ e leia cada callback.
  5. Busque por http:// e https:// em wp_enqueue_script para mapear CDNs.
  6. Compare o resultado com o changelog oficial do tema. O que não está documentado merece atenção.

Se você tem SSH, o mesmo trabalho sai com grep -rn "eval(" wp-content/themes/ direto no servidor. Se só tem painel de hospedagem, baixe o tema por FTP ou pelo gerenciador de arquivos e analise local. Não edite o tema em produção durante a revisão: um erro de sintaxe tira o site do ar.

Quando NÃO usar essa abordagem

Auditar tema próprio faz sentido quando você controla o código. Se o cliente usa um tema premium fechado, com atualização automática e suporte do desenvolvedor, sua revisão serve para confirmar origem e versão, não para reescrever o tema. Alterar tema de terceiro sem contrato de manutenção costuma quebrar atualização futura.

Também não vale a pena auditar tema que você vai substituir em duas semanas. Nesse caso, priorize o tema novo e mantenha o antigo isolado até a troca. E se o site já está comprometido, a auditoria de tema não substitui a limpeza. Nesse cenário, siga o processo de diagnosticar e limpar site WordPress hackeado em vários sites antes de voltar a replicar.

Erros comuns na revisão

  • Revisar só o tema pai e esquecer o child. O buraco costuma estar no child.
  • Confiar no nome do arquivo. Backdoor não se chama backdoor.php.
  • Apagar código suspeito sem copiar antes. Você perde a evidência e pode não remover o gancho.
  • Rodar a análise em produção. Um erro de sintaxe derruba o site.
  • Replicar o tema em cinco clientes antes de terminar a auditoria. Uma falha vira cinco incidentes.
  • Não registrar a versão auditada. Seis meses depois ninguém sabe o que foi checado.

Prevenção para quem replica em vários sites

Monte um tema-base auditado, versione no Git e trate como produto interno. Cada cliente recebe esse tema-base mais um child próprio. O child é o único lugar onde entra customização, e ele passa por revisão antes de ir para produção.

Restrinja quem pode editar tema no painel. Em wp-config.php, a constante DISALLOW_FILE_EDIT desliga o editor de temas e plugins. Isso reduz muito o risco de alguém com acesso administrativo inserir código sem passar pela revisão.

Mantenha um inventário de versões por site. Quando o tema-base recebe correção, você sabe exatamente quais clientes precisam atualizar. Esse controle é o que separa uma replicação organizada de um parque de sites desatualizados. Vale combinar com o que já foi discutido em atualização de segurança WordPress em vários sites, porque tema e plugin seguem a mesma lógica de propagação.

Se você administra muitos clientes, o trabalho de rechecar child, plugin e versão site por site é o que mais consome tempo. O 100% WP existe justamente para isso: centraliza atualização, backup e monitoramento dos sites em um painel só, o que ajuda a manter o tema-base sincronizado sem abrir site por site. Ainda assim, a auditoria de código continua sendo trabalho seu, porque nenhum painel lê functions.php por você.

Quando chamar alguém

Se você encontrou eval ou base64_decode no tema e não sabe o que o código faz, não mexa sozinho. O mesmo vale se o site já apresenta sintoma de comprometimento: redirecionamento, link injetado, usuário administrador desconhecido. Nesses casos, o tema pode ser só a ponta. Um serviço de segurança e remoção de malware faz a limpeza com rastreio da origem, o que evita que o problema volte na próxima replicação.

Por fim, antes de assumir um site novo com tema já instalado, vale conferir o que mais precisa ser avaliado além do tema. O artigo sobre o que avaliar antes de assumir um site WordPress cobre o restante da stack.

Deixe uma resposta

Seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados como *

Leia também

Ilustração sobre formatar texto no WordPress com plugin ou estilo do tema
Plugins
100%WP

Formatar texto WordPress: plugin ou estilo do tema?

Formatar texto no WordPress é dividir entre conteúdo e estilo: listas, tabelas e blocos reutilizáveis podem vir de plugins, mas cores, fontes e espaçamentos pertencem ao tema. Plugin que ‘embeleza’ acumula CSS e quebra na troca de tema.

Ilustração sobre SEO para vídeo no WordPress e marcação de vídeo em páginas
Plugins
100%WP

SEO para vídeo no WordPress: o que o plugin resolve

Antes de instalar um plugin de SEO para vídeo no WordPress, verifique se o vídeo já está no YouTube ou Vimeo, se o tema já injeta schema e se o problema é indexação ou velocidade. O plugin só resolve marcação e thumbnail; não conserta vídeo mal hospedado nem tema pesado.

Ilustração sobre escrever para SEO e planejar conteúdo antes de publicar no WordPress
SEO
100%WP

Escrever para SEO: o que fazer antes de publicar

Antes de escrever para SEO, defina a intenção de busca em uma frase, pesquise no próprio site se o tema já tem artigo e decida se o texto será novo ou uma atualização. Só depois monte título, H2s e palavras-chave. Essa ordem evita canibalização e retrabalho.