Filtros no PHP

O que é um filtro PHP?

Um filtro no PHP é usado para falidar e filtrar dados vindos de fontes inseguras.
Para testar, validar e filtrar entradas de usuário ou outros dados é uma parte importante de uma aplicação web.
A extenção de filtros do PHP é feita para tornar a filtragem de dados mais fácil e mais simples.

Porque usar um Filtro?

Quase todas as aplicações web dependes de entradas externas. Usualmente isto vem de um usuário ou outra aplicação (como um serviço web). Usando filtros você pode ter certeza de que a sua aplicação tem o correto valor.

Você sempre deve filtrar dados externos!
Filtragem de entradas é um dos mais sérios problemas de segurança.

O que são dados externos?
  • Dados enviados por formulário
  • Cookies
  • Dados de serviços externos
  • Variáveis do servidor
  • Resultados de consultas a bancos de dados

Funções e filtros

Para filtrar uma variável, você deve usar uma das seguintes funções.
  • filter_var() - Filtra uma única variável com um filtro especificado.
  • filter_var_array() - Filtra várias variáveis com o mesmo ou diferentes filtros
  • filter_input() - Recebe uma variável de input e filtra.
  • filter_input_array() - Recebe diversas variáveis e as filtra com o mesmo ou 
  • diferentes filtros
No exemplo abaixo nos validamos um número inteiro usando a função filter_var():
   1:<?php
2:$int = 123;
3:if(!filter_var($int, FILTER_VALIDATE_INT)) {
4: echo("Número não é válido");
5:}
6:else {
7: echo("Número é válido");
8:}
9:?>

O código acima usa o filtro "FILTER_VALIDATE_INT" para filtrar a variável. Como o número é válido, a saída do código será: "Número é válido".

Se nos tentarmos com uma variável que não é um número inteiro (como "123abc"), a saída será: "Número não é válido".

Para uma lista completa das funções e dos filtros visite a documentação do php

Validando e Limpando

Existem dois tipos de filtros:

Filtros de validação:
  • São usados para validar a entrada de usuário
  • Regras de formato estritas(com URL ou E-mail)
  • Retorna o tipo esperado no sucesso ou FALSE na falha
Filtros de limpeza
  • São usados para permitir ou não determinados caracteres em uma string.
  • Sem regras de formato.
  • Sempre retorna a string.
Opções e flags

Opções e flags são usados para adicionar opções de filtragem nos diferentes filtros.
Diferentes filtros têm diferentes opções e flags.
No exemplo abaixo nos validamos um número inteiro usando a função filter_var() e as opções "min_range" e "max_range":

   1:<?php
2:$var = 300;
3:$int_options = array(
4: "options"=>array(
5: "min_range"=>0,
6: "max_range"=>256
7: )
8:);
9:
10:if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) {
11: echo("Número inteiro válido");
12:}
13:else {
14: echo("Número inteiro inválido");
15:}
16:?>

Como no código acima as opções devem ser colocadas em um array associativo com o nome "options". Se um flag é usado ele não precisa estar em um array.

O número 300 não esta no limite especificado, e a saida do código será "Número inteiro inválido"

Validando entrada

Vamos tentar validar os dados de um formulário

A primeira coisa que nós precisamos é de confirmar que os dados de entrada que nos estamos procurando existem.
Então nós filtramos os dados de entrada com a função filter_input().

No exemplo abaixo a variável de entrada "e-mail" é enviada para a página PHP:
   1:<?php
2:if(!filter_has_var(INPUT_GET, "email")){
3: echo("Entrada não existe");
4:}
5:else {
6: if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)){
7: echo "E-mail não é válido";
8: }
9: else {
10: echo "E-mail é válido";
11: }
12:}
13:?>
Explicação do exemplo
  1. No exemplo acima tem um input (email) enviado usando o método "GET":
  2. Verifica se existe a entrada "email" nas variáveis GET.
  3. Se a variável existe, verifica se é um endereço de e-mail válido.
Limpando a entrada
Vamos tentar limpar uma URL enviada de um formulário.
Primeiro nós confirmamos que os dados que nos estamos procurando existe>
Então nós limpamos os dados de entrada usando a função filter_input().

No exemplo abaixo, a variável de entrada "url" é enviada para a página PHP:
   1:<?php
2:if(!filter_has_var(INPUT_POST, "url")) {
3: echo("Input type does not exist");
4:}
5:else {
6: $url = filter_input(INPUT_POST,
7: "url", FILTER_SANITIZE_URL);
8:}
9:?>

Explicação do exemplo

O exemplo acima tem um input (url) enviado usando o método "POST":
  1. Verifica se o input "url" existe nas variáveis POST.
  2. Se a variável de entrada existe, limpa (remove caracteres inválidos) e guarda na variável $url.
  3. Se a variável de entrada é uma string como "http://blóggêr.phpsqlbr.com/" a variável $url depois da limpeza ficará como abaixo:
http://blogger.phpsqlbr.com/
Filtrando múltiplas entradas

Um formulário quase sempre consiste de mais de um campo de entrada. Para evitar a chamada das funções filter_var e filter_input várias vezes, nos podemos usar a função filter_var_array() ou a função filter_input_array().

Neste exemplo nós usamos a função filter_input_array() para filtrar três variáveis GET. As variávies GET recebidas são nome, idade e e-mail:
   1:<?php
2:$filters = array(
3: "nome" => array (
4: "filter"=>FILTER_SANITIZE_STRING
5: ),
6: "idade" => array (
7: "filter"=>FILTER_VALIDATE_INT,
8: "options"=>array(
9: "min_range"=>1,
10: "max_range"=>120
11: )
12: ),
13: "email"=> FILTER_VALIDATE_EMAIL,
14:);
15:$result = filter_input_array(INPUT_GET, $filters);
16:if (!$result["idade"]) {
17: echo("A idade deve estar entre 1 and 120 anos.<br />");
18:}
19:else if(!$result["email"]) {
20: echo("E-mail não é válido.<br />");
21:}
22:else {
23: echo("Entrada do usuário é válida");
24:}
25:?>

Explicação do exemplo

O exemplo acina tem três entradas (nome, idade e email) enviados usando o método GET:
  1. Cria um array contendo o nome das variáveis de entrada e os filtros a serem usados em cada variável.
  2. Chama a função filter_input_array() com as variáveis GET e o array que foi criado.
  3. Verifica as variáveis idade e email na variável $result para verificar entradas inválidas (Se qualquer variável de entrada for inválida, aquela variável de entrada será igual a FALSE depois da função).
  4. O segundo parâmetro da função filter_input_array() pode ser um array ou um único ID de filtro.
Se o parâmetro é um único ID de filtro todos os valores do array de entrada são filtrados pelo filtro especificado.

Se o parâmetro é um array ele deve estar de acordo com as seguintes regras:
  • Ser um array associativo contendo on nome da variável de entrada como a chave do array (como a variável "idade")
  • O valor do array deve ser um ID de filtro ou um array especificando o, flags e opções.

Usando o Callback de Filtro

É possível chamar uma função definida pelo usuário e usa-la como filtro através do FILTER_CALLBACK. Desta forma nós temos total controle sobre a filtragem de dados.

Você pode criar sua própria função ou usar uma função existente no PHP.

A função que você quiser usar para filtrar é especificada da mesma forma que um option é especificado. Em um array associativo com o nome "options".

No exemplo abaixo nós usamos uma função criada para converter todos os caracteres "_"
para espaços em branco:
   1:<?php
2:function convertSpace($string) {
3: return str_replace("_", " ", $string);
4:}
5:
6:$string = "Pedro_é_um_grande_cara!";
7:
8:echo filter_var($string, FILTER_CALLBACK,
9: array("options"=>"convertSpace"));
10:?>

O resultado do código acima deve ser:
Pedro é um grande cara!
Explicação do exemplo
O exemplo acima converte todos os "_" em espaços:
  1. Cria uma função para converter "_" em espaço
  2. Chama a função filter_var() com o filtro FILTER_CALLBACK e um array contendo a função criada.
Fonte

5 comentários:

  1. òtimo tutorial, essa função é muito útil para se criar filtros reutilizáveis.

    ResponderExcluir
  2. Valew Lucas. Realmente é bem importante reutilizar.

    ResponderExcluir
  3. Olá Thiago!

    Consegui chegar até aqui.
    Espero agora aprender e dominar o tão esperado MySQL (junto com o PHP é claro).

    Abraços!

    ResponderExcluir
  4. O uso exponencial e exorbitante de tais utilidades que chega a ser inútil a olhares com certa capacidade para tais fins , chega a me deixar meramente capaz de dizer que seu documento é claramente bem relativo ao que muitos procuram , parabéns jovem pupilo !

    ResponderExcluir