Como corrigir vulnerabilidade XSS no WordPress
O que é a vulnerabilidade XSS no WordPress?
XSS (cross-site scripting) é uma falha em que dados controlados pelo atacante são exibidos numa página sem sanitização nem escape, fazendo o navegador da vítima executar um script injetado. No WordPress, costuma vir de um plugin ou tema que grava e mostra entradas de formulário, comentários ou parâmetros de URL sem tratar. O script roubado pode capturar cookies de sessão, redirecionar visitantes ou criar um admin oculto. Existem três tipos: refletido (via URL), armazenado (gravado no banco, o mais grave) e baseado em DOM. A correção real é tapar a entrada vulnerável, não só limpar o sintoma.
Como identificar
- O scanner de segurança ou o WPScan aponta “Cross-Site Scripting (XSS)” em um plugin ou tema instalado.
- Aparecem pop-ups inesperados ou redirecionamentos ao abrir uma página cujo parâmetro de URL carrega uma tag de script injetada.
- Comentários, campos de perfil ou formulários executam uma tag de script em vez de mostrá-la como texto.
- No console do navegador surgem scripts de domínios estranhos carregando junto com a sua página.
Como prevenir
- Escape toda saída de dado do usuário com esc_html(), esc_attr() ou esc_url() conforme o contexto
- Mantenha plugins e temas atualizados e remova os abandonados sem correção de segurança
- Use um WAF e uma Content-Security-Policy para bloquear scripts inline e de origens não autorizadas
Causa
- Plugin ou tema que exibe entrada do usuário (comentário, formulário, parâmetro de URL) sem escapar a saída.
- Uso de echo direto de $_GET ou $_POST no código sem passar por esc_html() ou esc_attr().
- Plugin desatualizado com uma vulnerabilidade XSS conhecida e já catalogada (CVE/WPScan) ainda não corrigida.
- Campo que aceita HTML sem filtrar por wp_kses(), permitindo a passagem de tags de script.
- Falta de Content-Security-Policy, deixando o navegador executar scripts inline injetados.
Como resolver
- Identifique a origem da falha: rode um scanner (WPScan ou plugin de segurança) para descobrir qual plugin/tema tem a vulnerabilidade XSS reportada e em qual versão ela foi corrigida.
- Atualize o plugin ou tema vulnerável: na maioria dos casos a brecha já tem correção. Atualize para a versão que fecha o XSS; se o componente foi abandonado, substitua-o por uma alternativa mantida.
- Sanitize a entrada e escape a saída no seu código: se a falha está em código próprio, limpe o dado ao receber e escape ao exibir. Nunca dê echo de entrada do usuário sem tratar.
- Adicione um cabeçalho Content-Security-Policy: configure uma CSP que restrinja a execução de scripts inline e de origens externas, reduzindo o impacto de qualquer injeção que escape.
- Limpe injeções já gravadas e troque as chaves: procure scripts salvos em posts, comentários e wp_options, remova-os, regenere as SALT keys do wp-config.php e troque as senhas de admin para invalidar sessões roubadas.
// Errado: exibe a entrada do usuario direto, abrindo XSS refletido
echo $_GET['nome'];
// Certo: escapa a saida conforme o contexto (texto, atributo, URL)
echo esc_html( $_GET['nome'] ); // dentro de texto/HTML
echo '<input value="' . esc_attr( $_GET['nome'] ) . '">'; // dentro de atributo
echo '<a href="' . esc_url( $_GET['link'] ) . '">'; // dentro de href
// Para salvar conteudo que aceita HTML limitado, filtre com wp_kses
$permitido = array( 'a' => array( 'href' => array() ), 'strong' => array(), 'em' => array() );
$conteudo_seguro = wp_kses( $_POST['bio'], $permitido );
update_user_meta( $user_id, 'bio', $conteudo_seguro );














