Os seus visitantes vão parar a uma página de lotaria, de farmácia ou de falso suporte técnico, enquanto do seu lado o site aparece normalmente. É a assinatura de um redirecionamento injetado, quase sempre condicional. Este guia explica como o reproduzir, encontrá-lo nos ficheiros ou na base de dados, e fechar o acesso que serviu para o colocar.
wp-config.php..htaccess, os ficheiros PHP, a base de dados e as definições de endereço do site.wp-content/uploads, plugins a reinstalar ou a eliminar.Um redirecionamento colocado durante um ataque escolhe a quem se aplica. Poupa quase sempre a pessoa que gere o site, para ficar no lugar o máximo de tempo possível. As condições mais comuns:
Referer do pedido.User-Agent.Uma mensagem de um cliente a dizer «o seu site envia-me para outro lado» merece por isso toda a atenção, mesmo que tudo apareça corretamente do seu lado.
Coloque-se no lugar do visitante que o sofre:
Se tiver acesso a um terminal, este comando pede a sua página inicial apresentando-se como um iPhone vindo do Google:
curl -s -i -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)" -e "https://www.google.com/" https://www.o-seu-site.com/
Leia as primeiras linhas da resposta. Um código 301 ou 302 seguido de uma linha Location: para um endereço desconhecido indica um redirecionamento feito pelo servidor: está no .htaccess ou num ficheiro PHP. Um código 200 quando o navegador é redirecionado indica um redirecionamento feito dentro da página, em JavaScript: está quase sempre na base de dados ou num ficheiro do tema.
wp-config.php, constante DB_PASSWORD) e cada conta de administrador WordPress.AUTH_KEY a NONCE_SALT do wp-config.php por um conjunto novo, gerado em https://api.wordpress.org/secret-key/1.1/salt/. Todas as sessões abertas são terminadas, incluindo a do intruso.wp config shuffle-salts
Na raiz do site, e por vezes numa subpasta, o .htaccess pode receber regras de reescrita acrescentadas pelo intruso. O bloco que o próprio WordPress escreve é curto e fica entre # BEGIN WordPress e # END WordPress:
# BEGIN WordPress
# As directivas (linhas) entre "BEGIN WordPress" e "END WordPress" são geradas
# dinamicamente e não deverão ser modificadas através de filtros do WordPress.
# Qualquer alteração às instruções entre estes marcadores será sobreposta.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Uma regra RewriteCond que testa %{HTTP_REFERER} (google, bing, facebook) ou %{HTTP_USER_AGENT} (android, iphone, mobile), seguida de uma RewriteRule para um endereço externo, é o redirecionamento. Os plugins de cache e de segurança também escrevem os seus próprios blocos, identificados com o respetivo nome: compare cada bloco com a lista dos seus plugins antes de o retirar.
O WP-CLI compara os ficheiros do núcleo do WordPress e dos plugins com as somas de verificação publicadas pelo WordPress.org, e lista cada ficheiro modificado ou acrescentado:
wp core verify-checksums
wp plugin verify-checksums --all
O segundo comando abrange os plugins distribuídos pelo diretório do WordPress.org. Um plugin comprado ao respetivo editor compara-se com uma cópia nova descarregada a partir da sua conta junto dele. É um caso frequente: nos 540 sites WordPress de PME do nosso levantamento de 1 de setembro de 2026, 66 % têm pelo menos um plugin ausente do diretório público.
Sem WP-CLI, duas pesquisas dão uma primeira triagem:
find . -name "*.php" -mtime -30
find wp-content/uploads -name "*.php"
A primeira lista os ficheiros PHP modificados nos últimos 30 dias, a segunda os ficheiros PHP guardados na pasta de multimédia, onde são suspeitos à partida (alguns plugins colocam lá um index.php vazio, o que é legítimo). Uma data de modificação pode ser falsificada: um ficheiro antigo no sítio errado continua a merecer exame.
Abra primeiro o wp-config.php, o index.php da raiz, o functions.php e o header.php do tema ativo, e a pasta wp-content/mu-plugins: os plugins que lá estão carregam-se automaticamente e não se desativam a partir da administração. Os sinais a procurar: eval(, base64_decode(, gzinflate(, str_rot13(, longas cadeias ilegíveis, ou window.location seguido de um endereço que não conhece.
Um redirecionamento em JavaScript instala-se facilmente no conteúdo das páginas ou nas definições, onde nenhum ficheiro o mostra. O WP-CLI procura uma cadeia de caracteres em todas as tabelas do WordPress:
wp db search "<script"
wp db search "fromCharCode"
Sem WP-CLI, as mesmas pesquisas fazem-se no phpMyAdmin, separador SQL:
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%<script%';
SELECT option_name FROM wp_options WHERE option_value LIKE '%<script%';
Alguns resultados são legítimos: uma ferramenta de medição de audiências, um aviso de cookies ou um widget colocado por si. O que não corresponde a nada do que instalou merece exame, em particular um script que constrói um endereço a partir de códigos de caracteres.
Em Opções > Geral, «Endereço do WordPress (URL)» e «Endereço do site (URL)» devem indicar o seu domínio. Os mesmos valores podem ser impostos no wp-config.php pelas constantes WP_HOME e WP_SITEURL: verifique os dois sítios.
wp option get home
wp option get siteurl
wp user list --role=administrator
Quando as constantes estão definidas, os dois primeiros comandos devolvem o valor delas. O último lista os administradores, com a data de registo; na administração, a mesma lista obtém-se no menu Utilizadores, filtrado por Administrador. Uma conta que ninguém reconhece elimina-se, atribuindo os seus conteúdos a uma conta legítima.
Apagar a linha que redireciona acaba com o sintoma. O acesso usado pelo intruso, esse, continua aberto enquanto não for encontrado, e o redirecionamento volta nos dias seguintes. A ordem que resulta:
wp-admin e wp-includes e execute wp core download --skip-content --force, que reescreve o núcleo sem tocar nos seus plugins, temas e multimédia. O comando substitui os ficheiros existentes mas não elimina nenhum ficheiro acrescentado: é por isso que as duas pastas se eliminam primeiro, e que os ficheiros PHP desconhecidos da raiz se retiram à mão.wp-content/uploads, as regras acrescentadas ao .htaccess e os scripts encontrados na base de dados.wp cron event list: uma tarefa com um nome desconhecido pode voltar a colocar o código.Se o site guarda dados pessoais (formulários, contas de clientes, encomendas), anote a hora a que constatou o ataque. Na União Europeia, o RGPD prevê a notificação de uma violação de dados pessoais à autoridade de controlo até 72 horas após ter tido conhecimento da mesma, a menos que a violação não seja suscetível de resultar num risco para os direitos e liberdades das pessoas singulares.
Quando o Google deteta o redirecionamento, o Chrome pode mostrar uma página vermelha «Site perigoso» antes de abrir o site, e o Google pode indicar por baixo do seu resultado de pesquisa que o site pode ter sido pirateado. O relatório de problemas de segurança do Google Search Console diz o que foi detetado e em que endereços. Com o site limpo, o pedido de revisão, feito a partir desse mesmo relatório, lança a verificação.
Um redirecionamento retirado deixa uma pergunta: quem trata do site a seguir? A Simafri retoma o seu site WordPress, coloca-o de novo online numa base que alojamos, protegemos e mantemos atualizada, e trata dele mês após mês. O seu nome de domínio e os seus conteúdos continuam a ser seus.
O código injetado lê o User-Agent do navegador e só redireciona os telemóveis. A pessoa que gere o site, muitas vezes num computador, não vê nada. Teste a partir de um telemóvel com dados móveis, ou com o curl enviando o identificador de um navegador móvel.
Reinstalar o núcleo reescreve os ficheiros do WordPress, sem eliminar os que um intruso possa ter acrescentado. A base de dados, o tema, os plugins e a pasta de multimédia ficam como estão, e é aí que o redirecionamento e o acesso do intruso se encontram na maioria dos casos. O núcleo novo é uma etapa da limpeza, a completar com a base de dados, os plugins, as contas e as palavras-passe.
Porque o acesso que serviu para o colocar ainda lá está: uma conta de administrador acrescentada, um ficheiro PHP escondido na multimédia, uma tarefa agendada, um plugin vulnerável. Cada um permite voltar a colocar o código depois da limpeza. Verifique as contas, a pasta wp-content/uploads, as tarefas agendadas e as versões dos plugins, e depois mude novamente as palavras-passe.
Abra o Google Search Console e depois o relatório de problemas de segurança: lista os problemas detetados e exemplos de endereços. Se o site ainda não estiver validado no Search Console, a validação por registo DNS abrange todo o domínio.
Simafri
Vamos falar do seu projeto
Diga-nos em poucas palavras o que precisa: respondemos-lhe rapidamente.
Obrigado! O seu pedido foi enviado. Responderemos em breve.
Prefere o email? Escreva-nos para support@simafri.com.