Filtros PHP Avançados: Um Guia Completo
Aprenda a usar filtros avançados do PHP para validar e sanitizar dados de entrada com flags, callbacks e filtragem em lote.
Filtrar entradas é um dos hábitos de segurança mais importantes no PHP: todo valor que chega de fora do seu código — campos de formulários, query strings, cookies, payloads de API — deve ser tratado como não confiável até que tenha sido validado ou limpo. O PHP inclui uma extensão de filtros nativa que faz exatamente isso, então raramente é necessário escrever expressões regulares manualmente para verificações comuns. Este capítulo vai além do básico e aborda flags de filtros, callbacks, filtragem em lote, valores padrão e as armadilhas que pegam as pessoas de surpresa em produção.
Se você não conhece a extensão de filtros, comece com o capítulo introdutório PHP Filters e depois volte aqui.
Entendendo os Filtros PHP
Um filtro é uma regra nomeada que o PHP aplica a um valor por meio da função filter_var() (e suas variantes). Há dois trabalhos que um filtro pode realizar:
- Validar — verificar se um valor já corresponde a um formato e retornar o valor em caso de sucesso ou
falseem caso de falha. O valor não é alterado. - Sanitizar — transformar um valor removendo ou codificando caracteres indesejados e retornar a string limpa.
Saber qual tarefa você precisa é importante: validação rejeita dados inválidos, sanitização os reescreve. Para formulários voltados ao usuário, geralmente você valida primeiro (rejeita) e sanitiza apenas quando precisa aceitar e limpar um valor (por exemplo, escapar HTML antes da exibição).
Tipos de Filtros
O PHP oferece vários tipos de filtros que podem ser usados para diferentes finalidades. Alguns dos filtros mais usados incluem:
- Filtros de validação: São usados para validar dados, como verificar se uma string é um endereço de e-mail válido ou se um número está dentro de um determinado intervalo.
- Filtros de sanitização: São usados para sanitizar dados, como remover caracteres prejudiciais de uma string ou converter caracteres especiais em entidades HTML.
- Filtros personalizados: Permitem definir suas próprias funções de filtro para necessidades específicas.
Alguns filtros cobrem a grande maioria das necessidades do mundo real:
| Filtro | Função | Exemplo de uso |
|---|---|---|
FILTER_VALIDATE_EMAIL | Validar | Verificar um endereço de e-mail |
FILTER_VALIDATE_INT | Validar | Verificar um inteiro, opcionalmente dentro de um intervalo |
FILTER_VALIDATE_FLOAT | Validar | Verificar um número de ponto flutuante |
FILTER_VALIDATE_URL | Validar | Verificar uma URL |
FILTER_VALIDATE_IP | Validar | Verificar um endereço IPv4/IPv6 |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Sanitizar | Codificar caracteres especiais HTML |
FILTER_SANITIZE_NUMBER_INT | Sanitizar | Remover tudo exceto dígitos e +/- |
FILTER_SANITIZE_EMAIL | Sanitizar | Remover caracteres ilegais em um e-mail |
Você pode listar todos os filtros suportados pela sua build com filter_list().
Usando Filtros PHP
A sintaxe básica para aplicar um filtro é:
Sintaxe da função filter_var do PHP
filter_var($variable, $filter, $options);Onde $variable é o valor que você deseja filtrar, $filter é uma constante de filtro como FILTER_VALIDATE_EMAIL, e o argumento opcional $options carrega flags ou opções por filtro.
filter_var($variable, FILTER_VALIDATE_EMAIL);Aqui filter_var() verifica se o valor armazenado em $variable é um endereço de e-mail válido, retornando o e-mail em caso de sucesso ou false em caso de falha.
Também existem funções dedicadas para ler entradas externas diretamente — filter_input() para um único valor e filter_input_array() para vários — que leem de INPUT_GET, INPUT_POST, INPUT_COOKIE e assim por diante. Use estas em vez de acessar $_GET/$_POST diretamente, pois elas leem os dados originais da requisição mesmo que uma superglobal tenha sido modificada.
Opções Avançadas de Filtros PHP
Os filtros PHP também possuem várias opções avançadas que podem ser usadas para personalizar o comportamento. Algumas das opções mais usadas incluem:
- Opções de flags: Modificam o comportamento do filtro, como exigir um tipo de dado específico ou permitir múltiplos valores. Por exemplo,
FILTER_FLAG_EMAIL_UNICODEpermite caracteres internacionais na validação de e-mail. - Funções de callback: Permitem passar uma função personalizada para
FILTER_CALLBACKpara lógica de validação ou sanitização personalizada. - Filtragem de arrays: Use
filter_var_array()oufilter_input_array()para aplicar filtros a múltiplas variáveis de uma vez, o que é especialmente útil para processar dados de formulários ou query strings.
Exemplos de Filtros PHP
Aqui estão alguns exemplos de como os filtros PHP podem ser usados em situações do mundo real:
PHP validar um e-mail usando filter_var
Neste exemplo, a função filter_var é usada para validar um endereço de e-mail. Se o endereço de e-mail for válido, o script exibirá "Email is valid"; caso contrário, exibirá "Email is not valid".
PHP sanitizar string usando filter_var
Neste exemplo, a função filter_var é usada para sanitizar uma string. O filtro FILTER_SANITIZE_FULL_SPECIAL_CHARS é usado para remover ou codificar tags HTML e caracteres especiais da string, resultando em uma string segura e limpa que pode ser usada na sua aplicação.
Exemplos Avançados de Filtros PHP
Para aproveitar todo o poder dos filtros PHP, você pode usar callbacks e filtragem de arrays:
PHP filtro com callback
<?php
function custom_sanitize($str) {
return strtoupper(trim($str));
}
$input = " hello world ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);
echo $result; // Outputs: HELLO WORLD
?>PHP filtrar array de variáveis
<?php
$data = [
"email" => "[email protected]",
"age" => "25",
"url" => "https://example.com"
];
$filters = [
"email" => FILTER_VALIDATE_EMAIL,
"age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
"url" => FILTER_VALIDATE_URL
];
$result = filter_var_array($data, $filters);
print_r($result);
?>A saída é:
Array
(
[email] => [email protected]
[age] => 25
[url] => https://example.com
)Se algum valor falhar no filtro, aquela chave conterá false em vez do valor, então você pode identificar exatamente qual campo era inválido.
Validar um inteiro dentro de um intervalo
As opções min_range e max_range fazem com que FILTER_VALIDATE_INT rejeite números fora dos limites — útil para coisas como uma quantidade ou uma idade:
<?php
$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>Como 150 está acima de max_range, o filtro retorna false mesmo que "150" seja uma string de inteiro perfeitamente válida.
Fornecer um valor padrão quando a validação falha
A maioria dos filtros de validação aceita uma opção default, para que você possa retornar a um valor seguro em vez de false:
<?php
$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
"options" => ["default" => 0.0]
]);
var_dump($price); // float(0)
?>Armadilhas Comuns
Alguns comportamentos surpreendem os iniciantes:
falseé um valor válido. Quando um valor é legitimamente0ou"0", uma verificação ingênua comif (filter_var(...))trata isso como falha. Compare comfalseexplicitamente usando o operador estrito:if (filter_var($n, FILTER_VALIDATE_INT) === false).- A validação não altera o valor.
FILTER_VALIDATE_*retorna seu valor original (com cast quando apropriado) oufalse; nunca sanitiza. Se precisar de uma string limpa, use um filtroFILTER_SANITIZE_*. - A validação de e-mail não verifica a entrega.
FILTER_VALIDATE_EMAILverifica apenas a sintaxe — não pode confirmar se a caixa de entrada existe. AdicioneFILTER_FLAG_EMAIL_UNICODEse aceitar endereços internacionalizados. - Sanitizar não é o mesmo que escapar para SQL. Use prepared statements (ou
mysqli_real_escape_string()) para consultas de banco de dados; filtros são para limpeza de formato, não segurança em queries.
Conclusão
Em conclusão, os filtros PHP são uma ferramenta essencial para desenvolvedores web que desejam validar e sanitizar dados de entrada. Com os diversos tipos e opções disponíveis, você pode facilmente adaptar seus filtros às necessidades específicas da sua aplicação. Seja para validar e-mails, remover caracteres prejudiciais ou realizar validações personalizadas, os filtros PHP têm tudo o que você precisa.
Não se esqueça de combinar filtros com outras medidas de segurança — prepared statements, escape de saída e proteção CSRF — para manter sua aplicação web o mais segura possível. Para um guia completo, consulte PHP Form Validation.