ENT_QUOTES no PHP: o que é, como funciona e quando usar

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

ConstanteDescriçãoExemplo de resultado
ENT_COMPATConverte apenas aspas duplas (")' permanece como está
ENT_QUOTESConverte aspas duplas e simples (", ')ambas são convertidas
ENT_NOQUOTESNã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 &quot;Car&quot;

// Aspas duplas e simples
echo htmlspecialchars($texto, ENT_QUOTES);
// Saída: John&#039;s &quot;Car&quot;
  • 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:

ConstanteDescrição
ENT_HTML401Define que o padrão de entidades é HTML 4.01
ENT_XML1Usa as entidades do padrão XML 1
ENT_XHTMLUsa entidades do padrão XHTML
ENT_HTML5Usa 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='&#039;&gt;&lt;script&gt;alert(&#039;XSS&#039;)&lt;/script&gt;'>

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

  1. Sempre defina o charset como UTF-8
    Utilize htmlspecialchars($texto, ENT_QUOTES, 'UTF-8'); e garanta que o cabeçalho da página esteja configurado: header('Content-Type: text/html; charset=UTF-8');
  2. 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.
  3. Use o tipo de escape correto para o contexto
    • htmlspecialchars() → para conteúdo HTML
    • json_encode() → para valores JavaScript
    • urlencode() → para parâmetros de URL
    • addslashes() (com cautela) → para strings SQL, embora o ideal seja prepared statements
  4. Evite concatenar HTML manualmente
    Prefira templates (Twig, Blade, etc.) que escapam automaticamente o conteúdo.
  5. Ative double_encode = false se for escapar conteúdo já seguro
    Isso impede a conversão dupla de entidades: htmlspecialchars($html, ENT_QUOTES, 'UTF-8', false);
  6. 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.

Rolar para cima