Em php podemos passar variáveis e valores pela URL de um navegador:
http://localhost/index.php?id=10
O link acima envia para index.php a variável id e dentro dessa o valor 10. uma interrogação(?) separa a variável do nome index.php.
Acontece que se essa variável não for tratada, qualquer pessoa poderá enviar id com um valor qualquer. Por exemplo, faça o teste enviando %3Cscript%3Ealert(%27Hi%27)%3C/script%3E
criei um arquivo chamado index.php com o seguinte conteúdo:
<?php
echo $_GET['id'];
?>
Agora cole a url abaixo em seu navegador e tecle Enter para ver um alerta
http://localhost/meusite/index.php?id=%3Cscript%3Ealert(%27Hi%27)%3C/script%3E
%3Cscript%3Ealert(%27Hi%27)%3C/script%3E é um script que emite um alerta.
Um hacker poderá fazer algo muito pior do que um simples alerta!
Se você achou curioso esses caracteres estranhos , veja esse post: Tabela com Referência de codificação de caracteres ASCII e esse outro artigo Rede e Internet: URL Encoding(URL Codificada)
Sanitização e Validação
A função filter_var() nos favorece com sanitização e validação de dados:
- sanitização desativa códigos maliciosos em potencial dos dados antes de processá-los.
- validação garante que os dados estejam no formato correto em relação ao tipo de dados, intervalo e valor.
A função filter_var() retorna o valor filtrado ou false se o filtro falhar.
Exemplo Sem Sanitização e Validação
Abaixo temos um link que envia idade=40 para a própria página
<html>
<a href="index.php?idade=40">link</>
<br>
<?php
echo $_GET['idade'];
?>
</html>
Ao clicarmos em link o resultado será:
link
40
mas esse código está vulnerável. Vamos trabalhar com ele. Podemos alterar a url com qualquer valor, inclusive uma string, float, ou código malicioso. exemplo:
http://localhost/meusite/index.php?idade=idosa
E a página irá receber idosa ao invés de 40 ou outra idade qualquer. Isso não está certo visto que o tipo de valor que queremos receber é um integer.
Exemplo Sanitizado e Validado
no artigo anterior vimos sobre a função filter_has_var(). Hoje veremos ela novamente mais a filter_var().
<html>
<a href="index.php?idade=40">link</>
<br>
<?php
if(filter_has_var(INPUT_GET,'idade')) {
$idade = filter_var($_GET['idade'],FILTER_SANITIZE_NUMBER_INT);
echo $idade;
} else {
echo "idade é necessário";
}
?>
</html>
Faça o teste novamente colocando ….idade=idoso e verá o resultado positivo, bloqueando o valor errado.
A função filter_var() com os filtros FILTER_SANITIZE_NUMBER_INT removerá todos os caracteres exceto os dígitos, sinais de mais e menos da variável idade.
Usando a função filter_var() para validar dados
Além de limpar os dados, podemos usar a função filter_var() para validar os dados de forma inteligente. Por exemplo,
<html>
<a href="index.php?idade=40">link</>
<br>
<?php
if(filter_has_var(INPUT_GET, 'idade')) {
$limpa_idade = filter_var($_GET['idade'], FILTER_SANITIZE_NUMBER_INT);
$idade = filter_var($limpa_idade, FILTER_VALIDATE_INT);
echo $idade === false ? 'dado inválido' : $idade;
} else {
echo 'dado inválido';
}
?>
</html>
O código acima validará as URLs da seguinte forma:
A URL abaixo retornará dado inválido
http://localhost/meusite/index.php?idade=idosa
A URL abaixo retornará somente 44 pois elimina as letras
http://localhost/meusite/index.php?idade=ido4sa4
filter_var() com Valor Mínimo, Máximo ou Padrão
Podemos usar FILTER_VALIDATE_INT para definir um valor mínimo, máximo que o usuário será obrigado a inserir.
....
$idade = filter_var($limpa_idade, FILTER_VALIDATE_INT, ['options' [ => 'min_range' => 10 ]]);
Lista de Filtros para Sanitização
Abaixo estão links para tabelas de filtros. São 4 tabelas com os seguintes tipos de filtros:
Conclusão
Vimos um assunto importantíssimo e que conta muito na segurança do nosso código PHP.
Ao lidar com dados externos, precisamos sanitizá-los(higienizar) e validá-los para fins de segurança. Os dados externos podem vir de entradas do usuário ou API de terceiros.
Uma boa regra: nunca confie em dados externos!
Comments on “PHP: Usando a Função filter_var() para Sanitização e Validação de Dados”