Sanitizar e validar dados com filtros PHP

A validação de dados é parte integrante do trabalho com formulários. Os dados enviados inválidos não apenas podem levar a problemas de segurança, mas também podem quebrar sua página da web. Hoje, veremos como remover caracteres ilegais e validar dados usando a função “filter_var”.


Um exemplo pode ser visto abaixo. Um usuário inseriu o texto “Não tenho um” como sua página inicial. Se esses dados fossem inseridos em um banco de dados e posteriormente recuperados como um link, o link seria quebrado.

A maioria das pessoas tende a pensar na validação de dados como um processo imensamente tedioso em que:

  • Compara os dados que eles desejam validar com todas as combinações possíveis que possam imaginar.
  • Tenta encontrar uma expressão regular dourada que corresponda a todas as combinações possíveis.
  • Uma combinação dos dois.

Existem problemas óbvios com os listados acima:

  • É absolutamente demorado.
  • A chance de erro é muito grande.

Felizmente, a partir da versão 5.2, o PHP incluiu uma ótima função chamada filter_var isso tira a dor da validação de dados.

filter_var em ação

filter_var fará, tanto, higienizar quanto validar os dados. Qual a diferença entre os dois?

  • A higienização removerá qualquer caractere ilegal dos dados.
  • A validação determinará se os dados estão no formato adequado.

Observação: por que higienizar e não apenas validar? É possível que o usuário tenha digitado acidentalmente um caractere errado ou talvez tenha sido copiado e colado incorretamente. Ao higienizar os dados, você assume a responsabilidade de caçar o erro do usuário.

Como usar filter_var

Usando filter_var é incrivelmente fácil. É simplesmente uma função PHP que recebe dois dados:

  • A variável que você deseja verificar
  • O tipo de cheque a ser usado

Por exemplo, o código abaixo removerá todas as tags HTML de uma string:

1
$string = "

Hello, World!

"
;
2
$new_string = filter_var($string, FILTER_SANITIZE_STRING);
3
// $new_string is now "Hello, World!"

Aqui está outro exemplo – desta vez mais difícil. O código abaixo garantirá que o valor da variável seja um endereço IP válido:

1
$ip = "127.0.0.1";
2
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
3
// $valid_ip is TRUE

4

5
$ip = "127.0.1.1.1.1";
6
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
7
// $valid_ip is FALSE

É assim que é simples de usar filter_var. Para obter uma lista completa de todas as regras que você pode verificar, consulte o final deste tutorial.

Exemplo de higienização

Abaixo está um exemplo rápido de limpeza de entrada de dois campos: um campo de e-mail e um campo de página inicial. Este exemplo removerá todos os caracteres que não devem ocorrer em nenhum dos tipos de dados.

1

2
    if (isset($_POST['email'])) {
3
        echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
4
        echo "

"
;
5
    }
6

7
    if (isset($_POST['homepage'])) {
8
        echo filter_var($_POST['homepage'], FILTER_SANITIZE_URL);
9
        echo "

"
;
10
    }
11
?>
12

13
 name="form1" method="post" action="form-sanitize.php">
14
    Email Address: 
15
     type="text" name="email" value=" echo $_POST['email']; ?>" size="50"/> 

16
    Home Page: 
17
     type="text" name="homepage" value=" echo $_POST['homepage']; ?>" size="50" /> 
18
    
19
     type="submit" />
20

Usando o FILTER_SANITIZE_EMAIL e FILTER_SANITIZE_URL constantes definidas pelo PHP, o trabalho de adivinhação de saber quais caracteres são ilegais acabou.

Exemplo de Validação

Só porque os dados são limpos não garante que eles sejam formatados corretamente. No exemplo abaixo, os dados não precisam ser limpos, mas é óbvio que a entrada do usuário não é um e-mail ou url.

Para garantir que os dados estejam formatados corretamente, eles precisam ser validados.

1

2
    if (isset($_POST['email'])) {
3
        $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
4
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
5
            echo "$email is a valid email address.

"
;
6
        } else {
7
            echo "$email is NOT a valid email address.

"
;
8
        }
9
    }
10

11
    if (isset($_POST['homepage'])) {
12
        $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL);
13
        if (filter_var($homepage, FILTER_VALIDATE_URL)) {
14
            echo "$homepage is a valid URL.

"
;
15
        } else {
16
            echo "$homepage is NOT a valid URL.

"
;
17
        }
18
    }
19
?>
20

21
 name="form1" method="post" action="form-validate.php">
22
Email Address: 
23
 type="text" name="email" value=" echo $_POST['email']; ?>" size="50"/> 

24
Home Page: 
25
 type="text" name="homepage" value=" echo $_POST['homepage']; ?>" size="50" /> 
26

27
 type="submit" />
28

Agora que os dados foram validados, você pode ter certeza de que as informações enviadas são exatamente o que você procura.

Juntando tudo: um formulário de envio de e-mail

Agora que a limpeza e validação de dados foram abordadas, colocaremos essas habilidades em uso com um rápido formulário de envio de e-mail. Isso não será de forma alguma de qualidade de produção – por exemplo, nenhum formulário deve exigir uma página inicial – mas funcionará perfeitamente para este tutorial. O formulário terá 4 informações:

  • Nome
  • Endereço de email
  • Pagina inicial
  • Mensagem

Iremos higienizar e validar todos os 4 dados e enviaremos o e-mail apenas se todos forem válidos. Se algo estiver inválido ou se algum campo estiver em branco, o formulário será apresentado ao usuário junto com uma lista de itens a serem corrigidos. Também devolveremos os dados higienizados ao usuário caso ele não saiba que determinados caracteres são ilegais.

Passo 1 – Criando o Formulário

Para a primeira etapa, basta criar um elemento de formulário com 5 campos: o for listado acima e um botão de envio:

1
 name="form1" method="post" action="form-email.php">
2
    Name: 
3
     type="text" name="name" value=" echo $_POST['name']; ?>" size="50" />

4
    Email Address: 
5
     type="text" name="email" value=" echo $_POST['email']; ?>" size="50"/> 

6
    Home Page: 
7
     type="text" name="homepage" value=" echo $_POST['homepage']; ?>" size="50" /> 

8
    Message: 
9
     name="message" rows="5" cols="50"> echo $_POST['message']; ?>
10
    
11
     type="submit" name="Submit" />
12

Etapa 2 – Determinar se o formulário foi enviado

Você pode verificar se um formulário foi enviado vendo se o botão enviar foi “definido”. Coloque o seguinte código acima do seu formulário:

1
if (isset($_POST['Submit'])) {
2

3
}

Passo 3 – Validando o Nome e Campo de Mensagem

Como os campos de nome e mensagem serão higienizados e validados da mesma forma, faremos isso juntos. Primeiro, verifique se algum campo está em branco fazendo o seguinte:

1
if ($_POST['name'] == "")
2

3
if ($_POST['message'] == "")

Em seguida, higienize-os com o FILTER_SANITIZE_STRING constante

1
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
2

3
$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

Por fim, verifique se os dois campos ainda não estão em branco. Isso é para garantir que, após remover todos os caracteres ilegais, você não fique com um campo em branco:

1
if ($_POST['name'] == "")
2

3
if ($_POST['message'] == "")

Não faremos nenhuma validação nesses dois campos simplesmente porque não há uma maneira absoluta de validar um nome ou uma mensagem arbitrária.

O código final fica assim:

1
if ($_POST['name'] != "") {
2
    $_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
3
    if ($_POST['name'] == "") {
4
        $errors .= 'Please enter a valid name.

'
;
5
    }
6
} else {
7
    $errors .= 'Please enter your name.
'
;
8
}
9

10
if ($_POST['message'] != "") {
11
    $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
12
    if ($_POST['message'] == "") {
13
        $errors .= 'Please enter a message to send.
'
;
14
    }
15
} else {
16
    $errors .= 'Please enter a message to send.
'
;
17
}

Etapa 4 — Validar o campo de e-mail

O campo de e-mail será limpo e validado da mesma forma que foi feito anteriormente no tutorial.

Primeiro, verifique se não está em branco:

1
if ($_POST['email'] != "")

Em seguida, higienize-o:

1
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

Por fim, valide-o como um endereço de e-mail verdadeiro:

1
if (!filter_var($email, FILTER_VALIDATE_EMAIL))

O código final fica assim:

1
if ($_POST['email'] != "") {
2
    $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
3
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
4
        $errors .= "$email is NOT a valid email address.

"
;
5
    }
6
} else {
7
    $errors .= 'Please enter your email address.
'
;
8
}

Etapa 5 — Validar o campo da página inicial

Novamente, o campo da página inicial será limpo e validado da mesma forma que anteriormente no tutorial.

Primeiro, verifique se não está em branco:

1
if ($_POST['homepage'] != "")

Em seguida, limpe-o e remova quaisquer caracteres ilegais:

1
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL)

Por fim, valide-o para garantir que seja um URL verdadeiro:

1
if (!filter_var($homepage, FILTER_VALIDATE_URL))

O código final fica assim:

1
if ($_POST['homepage'] != "") {
2
    $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL);
3
    if (!filter_var($homepage, FILTER_VALIDATE_URL)) {
4
        $errors .= "$homepage is NOT a valid URL.

"
;
5
    }
6
} else {
7
    $errors .= 'Please enter your home page.
'
;
8
}

Etapa 6 — Verifique se há erros e envie a mensagem

Agora que passamos por todos os campos, é hora de relatar os erros ou enviar a mensagem. Comece assumindo que não houve erros:

Em seguida, crie a mensagem de e-mail:

1
$mail_to = '[email protected]';
2
$subject = 'New Mail from Form Submission';
3
$message  = 'From: ' . $_POST['name'] . "n";
4
$message .= 'Email: ' . $_POST['email'] . "n";
5
$message .= 'Homepage: ' . $_POST['homepage'] . "n";
6
$message .= "Message:n" . $_POST['message'] . "nn";

Por fim, envie a mensagem:

1
mail($to, $subject, $message);

No entanto, se houver algum erro, informe-o e peça ao usuário que tente novamente:

1
echo '
' . $errors . '
'
;

O projeto finalizado fica assim:

1

2

3
    if (isset($_POST['Submit'])) {
4

5
        if ($_POST['name'] != "") {
6
            $_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
7
            if ($_POST['name'] == "") {
8
                $errors .= 'Please enter a valid name.

'
;
9
            }
10
        } else {
11
            $errors .= 'Please enter your name.
'
;
12
        }
13

14
        if ($_POST['email'] != "") {
15
            $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
16
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
17
                $errors .= "$email is NOT a valid email address.

"
;
18
            }
19
        } else {
20
            $errors .= 'Please enter your email address.
'
;
21
        }
22

23
        if ($_POST['homepage'] != "") {
24
            $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL);
25
            if (!filter_var($homepage, FILTER_VALIDATE_URL)) {
26
                $errors .= "$homepage is NOT a valid URL.

"
;
27
            }
28
        } else {
29
            $errors .= 'Please enter your home page.
'
;
30
        }
31

32
        if ($_POST['message'] != "") {
33
            $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
34
            if ($_POST['message'] == "") {
35
                $errors .= 'Please enter a message to send.
'
;
36
            }
37
        } else {
38
            $errors .= 'Please enter a message to send.
'
;
39
        }
40

41
        if (!$errors) {
42
            $mail_to = '[email protected]';
43
            $subject = 'New Mail from Form Submission';
44
            $message  = 'From: ' . $_POST['name'] . "n";
45
            $message .= 'Email: ' . $_POST['email'] . "n";
46
            $message .= 'Homepage: ' . $_POST['homepage'] . "n";
47
            $message .= "Message:n" . $_POST['message'] . "nn";
48
            mail($to, $subject, $message);
49

50
            echo "Thank you for your email!

"
;
51
        } else {
52
            echo '
' . $errors . '
'
;
53
        }
54
    }
55
?>
56

57
 name="form1" method="post" action="form-email.php">
58
Name: 
59
 type="text" name="name" value=" echo $_POST['name']; ?>" size="50" />

60
Email Address: 
61
 type="text" name="email" value=" echo $_POST['email']; ?>" size="50"/> 

62
Home Page: 
63
 type="text" name="homepage" value=" echo $_POST['homepage']; ?>" size="50" /> 

64
Message: 
65
 name="message" rows="5" cols="50"> echo $_POST['message']; ?>
66

67
 type="submit" name="Submit" />
68

Resumo

Espero que a leitura deste tutorial tenha lhe dado uma boa introdução aos novos recursos de filtragem de dados do PHP. Ainda existem muitas outras funções e regras que não foram abordadas, portanto, se você estiver interessado em aprender mais, consulte a seção Filtragem de Dados no manual do PHP.

  • Assine o RSS Feed do NETTUTS para mais tuts e artigos diários sobre desenvolvimento web.

[ad_2]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *