Ao lidar com entrada de dados no PHP, especialmente texto exibido em páginas HTM, é fundamental escapar caracteres especiais para evitar falhas de exibição e vulnerabilidades como XSS (Cross-Site Scripting).
Uma das funções mais usadas para isso é htmlspecialchars(), e uma de suas opções mais importantes é a constante ENT_QUOTES.
O que é o ENT_QUOTES
ENT_QUOTES é uma constante de configuração utilizada nas funções htmlspecialchars() e htmlentities() para indicar que tanto aspas simples quanto aspas duplas devem ser convertidas em entidades HTML.
Essas funções transformam caracteres especiais (<, >, ", ', &) em sequências seguras que o navegador interpreta como texto, e não como código HTML.
Sintaxe
htmlspecialchars(string $string, int $flags = ENT_COMPAT, ?string $encoding = null, bool $double_encode = true): string
O segundo parâmetro $flags define o comportamento da função. É nesse parâmetro que ENT_QUOTES pode ser aplicado.
Opções mais comuns de escape
| Constante | Descrição | Exemplo de resultado |
|---|---|---|
ENT_COMPAT | Converte apenas aspas duplas (") | ' permanece como está |
ENT_QUOTES | Converte aspas duplas e simples (", ') | ambas são convertidas |
ENT_NOQUOTES | Não converte aspas | ' e " permanecem inalteradas |
Exemplo prático
$texto = "John's \"Car\"";
// Apenas aspas duplas
echo htmlspecialchars($texto, ENT_COMPAT);
// Saída: John's "Car"
// Aspas duplas e simples
echo htmlspecialchars($texto, ENT_QUOTES);
// Saída: John's "Car"
- Com
ENT_COMPAT: somente"é convertido. - Com
ENT_QUOTES:'e"são convertidos.
Por que usar ENT_QUOTES
Quando se insere valores dinâmicos dentro de atributos HTML, é essencial escapar ambos os tipos de aspas.
Isso garante que, independentemente da forma como o atributo é delimitado, não haverá quebra de contexto HTML ou risco de execução de scripts injetados.
Exemplo seguro:
echo "<input value='" . htmlspecialchars($usuario, ENT_QUOTES) . "'>";
Sem o ENT_QUOTES, se o usuário inserir uma aspa simples ('), o atributo seria encerrado prematuramente, quebrando o HTML e abrindo brecha para ataques XSS.
Diferença entre ENT_QUOTES e htmlentities
htmlspecialchars()escapa apenas os caracteres HTML críticos.htmlentities()converte todos os caracteres que possuem uma entidade HTML correspondente.
Em ambos os casos, ENT_QUOTES controla o tratamento das aspas.
Outras constantes úteis
Além de ENT_QUOTES, o PHP oferece outras opções complementares:
| Constante | Descrição |
|---|---|
ENT_HTML401 | Define que o padrão de entidades é HTML 4.01 |
ENT_XML1 | Usa as entidades do padrão XML 1 |
ENT_XHTML | Usa entidades do padrão XHTML |
ENT_HTML5 | Usa entidades compatíveis com HTML5 |
Essas opções podem ser combinadas, por exemplo:
htmlspecialchars($texto, ENT_QUOTES | ENT_HTML5);
Exemplo real de XSS resolvido com ENT_QUOTES
Considere um campo de login simples:
<input value='<?php echo $_GET["user"]; ?>'>
Se o usuário acessar:
/login.php?user='><script>alert('XSS')</script>
O navegador renderizará:
<input value=''><script>alert('XSS')</script>'>
Resultado: o script é executado, comprometendo a página.
Agora, protegendo com ENT_QUOTES:
<input value='<?php echo htmlspecialchars($_GET["user"], ENT_QUOTES, "UTF-8"); ?>'>
Saída real:
<input value=''><script>alert('XSS')</script>'>
Nenhum código JavaScript é executado, e o texto é exibido como literal.
A vulnerabilidade é completamente neutralizada.
Boas práticas de escape e codificação segura em PHP
- Sempre defina o charset como UTF-8
Utilizehtmlspecialchars($texto, ENT_QUOTES, 'UTF-8');e garanta que o cabeçalho da página esteja configurado:header('Content-Type: text/html; charset=UTF-8'); - Escape no momento certo
Faça o escape na saída (output), e não na entrada (input).
Os dados devem ser armazenados brutos e apenas tratados no momento da exibição. - Use o tipo de escape correto para o contexto
htmlspecialchars()→ para conteúdo HTMLjson_encode()→ para valores JavaScripturlencode()→ para parâmetros de URLaddslashes()(com cautela) → para strings SQL, embora o ideal seja prepared statements
- Evite concatenar HTML manualmente
Prefira templates (Twig,Blade, etc.) que escapam automaticamente o conteúdo. - Ative
double_encode = falsese for escapar conteúdo já seguro
Isso impede a conversão dupla de entidades:htmlspecialchars($html, ENT_QUOTES, 'UTF-8', false); - Nunca confie em dados vindos de GET, POST ou COOKIE
Todo conteúdo vindo do usuário deve ser considerado potencialmente malicioso.
Conclusão
ENT_QUOTES é uma constante simples, mas essencial para segurança e integridade do HTML gerado pelo PHP.
Ela garante que todo conteúdo dinâmico seja exibido corretamente e sem riscos de injeção, principalmente em atributos e contextos sensíveis.
Em resumo:
Sempre que for escapar conteúdo HTML que venha de entrada do usuário, use:
htmlspecialchars($variavel, ENT_QUOTES, 'UTF-8');
E combine isso com práticas de codificação segura para construir aplicações PHP realmente robustas e livres de vulnerabilidades.
