PHP filtro_var

Resumo : neste tutorial, você aprenderá como usar a filter_var()função PHP para higienizar e validar dados.

Introdução à função filter_var() do PHP

Ao lidar com dados externos, você precisa higienizá-los e validá-los para fins de segurança. Os dados externos podem vir de entradas do usuário ou de API de terceiros.

Uma boa regra é que você nunca deve confiar em dados externos. E você deve sempre:

  • Limpe e valide os dados antes de armazená-los no banco de dados.
  • Espace os dados antes de exibi-los em uma página da web.

Suponha que você tenha um URL que contém uma string de consulta como esta:

http://localhost:8080/index.php?id=10Linguagem de código:  texto simples  ( texto simples )

E você deseja exibir $idna página:

echo $_GET['id'];Linguagem de código:  PHP  ( php )

Nesse caso, você verá que a página exibe o número 10.

No entanto, um hacker mal-intencionado pode alterar o valor de idpara algo como este:

%3Cscript%3Ealert(%27Hi%27)%3C/script%3E

E a URL será:

http://localhost:8080/phptutorial/filter_var/index.php?id=%3Cscript%3Ealert(%27Hi%27)%3C/script%3ELinguagem de código:  JavaScript  ( javascript )

Nesse caso, você verá um alerta no navegador da web. Neste exemplo, o valor de id não é um número, mas um trecho de código JavaScript que mostra um alerta .

Imagine a seguinte situação:

  • Primeiro, um hacker cria um link para a página de um domínio legítimo ( https://www.mybank.com/login/?id=...). com um ID que contém código malicioso em vez de um número válido. E, infelizmente, a página não limpa e valida a entrada.
  • Segundo, o hacker incorpora o link em um e-mail e o envia aos usuários do mybank.com.
  • Terceiro, os usuários veem o link com um domínio legítimo e clicam nele. Quando chegam à página, são redirecionados para o site do hacker com a mesma aparência ( https://www.mybank.on-a-malicious-domain.com/login/).
  • Por fim, os usuários acessam suas contas e perdem as credenciais bancárias para o hacker.

Para evitar isso, você precisa higienizar e validar os dados antes de processá-los.

  • A sanitização desativa possíveis códigos maliciosos dos dados antes de processá-los.
  • A validação garante que os dados estejam no formato correto em relação ao tipo, intervalo e valor dos dados.

PHP tem a filter_var()função que oferece suporte para higienizar e validar dados. Aqui está a sintaxe da filter_var()função:

filter_var ( mixed $value , int $filter = FILTER_DEFAULT , array|int $options = 0 ) : mixedLinguagem de código:  PHP  ( php )

A filter_var()função tem os seguintes parâmetros:

  • $valueé o valor que será filtrado.
  • $filteré o ID do filtro a ser aplicado. O ID do filtro determina como a filter_var()função filtra o arquivo $value.
  • $optionsé uma matriz associativa de opções ou uma lista de sinalizadores separados pela barra vertical ( |).

A filter()função retorna o valor filtrado ou falsese o filtro falhar.

Exemplo de função PHP filter_var()

Vejamos um exemplo de uso da filter_var()função.

1) Usando a função PHP filter_var() para limpar dados

O exemplo a seguir usa a filter_var()função para limpar o ID de uma string de consulta:

<?php

if (filter_has_var(INPUT_GET, 'id')) {
	// sanitize id
	$id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);
	// show the id
	var_dump($id);
} else {
	echo 'id is required.';
}
Linguagem de código:  HTML, XML  ( xml )

Observe que a filter_has_var()função retorna truese a string de consulta contiver o idparâmetro.

Se você navegar até o URL:

http://localhost:8080/index.php?id=10Linguagem de código:  JavaScript  ( javascript )

você verá o seguinte valor:

string(2) "10"Linguagem de código:  JavaScript  ( javascript )

Porém, se você usar o seguinte link que possui um id com código malicioso:

http://localhost:8080/index.php?id=%3Cscript%3Ealert(%27Hi%27)%3C/script%3ELinguagem de código:  JavaScript  ( javascript )

você verá o seguinte:

string(0) ""Linguagem de código:  JavaScript  ( javascript )

A filter_var()função com os FILTER_SANITIZE_NUMBER_INTfiltros removerá todos os caracteres, exceto os dígitos, sinais de mais e menos da idvariável. Confira todos os IDs de filtro que você pode usar para limpar dados.

2) Usando a função PHP filter_var() para validar dados

Além de higienizar os dados, você pode usar a filter_var()função para validar os dados. Por exemplo:

<?php

if (filter_has_var(INPUT_GET, 'id')) {
	// sanitize id
	$clean_id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);

	// validate id
	$id = filter_var($clean_id, FILTER_VALIDATE_INT);

	// show the id if it's valid
	echo $id === false ? 'Invalid id' : $id;
} else {
	echo 'id is required.';
}
Linguagem de código:  PHP  ( php )

Neste exemplo, passamos o iddo $_GETarray para a filter_var()função e usamos o id do filtro FILTER_VALIDATE_INTpara validar se $_GET['id']é um número inteiro ou não.

Se o resultado for false, então ele mostra a mensagem 'Invalid id'. Caso contrário, ele descarta o valor do id.

Se idfor um número inteiro, por exemplo:

http://localhost:8080/index.php?id=10Linguagem de código:  JavaScript  ( javascript )

…você verá o seguinte valor na tela:

10

Observe que a filter_var()função converte implicitamente a string ‘ 10'em inteiro 10.

Se o valor de idfor diferente de um número inteiro, você verá a mensagem:

Invalid id

Alguns IDs de filtro suportam opções adicionais. Por exemplo, FILTER_VALIDATE_INTpermite especificar o intervalo mínimo, o intervalo máximo e o valor padrão quando o filtro falha.

Para ter certeza de que o valor de idé maior que 10, use o $optionsargumento na filter_var()função da seguinte maneira:

<?php

if (filter_has_var(INPUT_GET, 'id')) {
    // sanitize id
    $clean_id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);

    if ($clean_id) {
        // validate id with options
        $id = filter_var($clean_id, FILTER_VALIDATE_INT, ['options' => [
            'min_range' => 10
        ]]);

        // show the id if it's valid
        echo $id === false ? 'id must be at least 10' : $id;
    }
    else {
         echo 'id is invalid.';
    }
} else {
    echo 'id is required.';
}Linguagem de código:  PHP  ( php )

Se você não tiver o ID na string de consulta, receberá o seguinte erro:

id is required.

Se você tiver um ID que não seja um número inteiro, como o seguinte:

index.php?id=abc

… você receberá o seguinte erro:

id is invalid.

Porém, se você tiver um id com valor que não pode ser convertido em um número inteiro como este:

index.php?id=123abc

…você obterá o id com o valor 123porque o FILTER_SANITIZE_NUMBER_INTfiltro remove os abccaracteres do id.

Se você tiver um ID com valor menor que 10:

index.php?id=9

… você receberá a seguinte mensagem:

id must be at least 10

Resumo

  • Os dados externos não são confiáveis. Portanto, você deve sempre higienizar e validar os dados externos.
  • Use a filter_var()função PHP para limpar e validar dados.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *