Como prevenir XSS em PHP: escape de saída na prática
XSS (Cross-Site Scripting) se previne escapando a saída no momento de exibir dados do usuário. A regra é simples: todo dado que veio de fora (formulário, URL, banco) deve ser escapado conforme o contexto onde será impresso — HTML, atributo, URL ou JavaScript.
O risco
Se você ecoa um nome digitado sem tratar, um atacante pode enviar <script>roubarCookie()</script> e o código roda no navegador de outros usuários, sequestrando sessões.
Escape por contexto
Para texto e atributos HTML, use htmlspecialchars com ENT_QUOTES:
function e($v) {
return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
echo '<p>Olá, ' . e($nome) . '</p>';
Para embutir um valor em JavaScript, serialize com json_encode (com flags JSON_HEX_TAG); para URLs, use rawurlencode. Nunca jogue dado cru dentro de <script>.
CSP como defesa em profundidade
Mesmo escapando tudo, ative uma Content-Security-Policy estrita. Ela bloqueia a execução de scripts não autorizados, contendo o estrago caso uma falha escape. Escape de saída e CSP se complementam — não substitua um pelo outro.
Perguntas frequentes
Devo escapar na entrada ou na saída?
Valide na entrada, mas escape na SAÍDA, conforme o contexto. O mesmo dado pode ir para HTML, URL ou JS, cada um com escape diferente.
htmlspecialchars sozinho basta?
Cobre os contextos de HTML e atributos. Para JS e URL use json_encode e rawurlencode. E combine com CSP.
Continue lendo
- Proteção CSRF em formulários PHP com tokens
- Content-Security-Policy na prática para sites PHP
- Cabeçalhos de segurança HTTP essenciais em 2026
Procurando uma suporte especializado WordPress?
O Site Seguro é especialista 100% em segurança WordPress, com SLA, garantia contra reincidência e atendimento humano no Brasil.
Conhecer nosso serviço →