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=10
Linguagem de código: texto simples ( texto simples )
E você deseja exibir $id
na 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 id
para 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%3E
Linguagem 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 ) : mixed
Linguagem 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 afilter_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 false
se 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 true
se a string de consulta contiver o id
parâmetro.
Se você navegar até o URL:
http://localhost:8080/index.php?id=10
Linguagem 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%3E
Linguagem 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_INT
filtros removerá todos os caracteres, exceto os dígitos, sinais de mais e menos da id
variá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 id
do $_GET
array para a filter_var()
função e usamos o id do filtro FILTER_VALIDATE_INT
para 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 id
for um número inteiro, por exemplo:
http://localhost:8080/index.php?id=10
Linguagem 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 id
for diferente de um número inteiro, você verá a mensagem:
Invalid id
Alguns IDs de filtro suportam opções adicionais. Por exemplo, FILTER_VALIDATE_INT
permite 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 $options
argumento 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 123
porque o FILTER_SANITIZE_NUMBER_INT
filtro remove os abc
caracteres 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.