Validação de dados no PHP

Um dos princípios de segurança de um sistema Web é que você não deve acreditar 100% no que o usuário possa inserir nos campos de um formulário (dados enviados pelo POST) ou alteração da URL (dados enviados pelo GET). Nesta postagem, não vou focar segurança em si, mas vou mostrar como validar os dados dos usuários para que o seu site/sistema tenha um melhor controle dos dados manipulados.

Este tipo de validação pode ser feito diretamente pelo navegador do usuário com o Javascript, mas como você não deve confiar nisto, acaba não sendo 100% seguro, então irei mostrar como fazer no servidor, diretamente no PHP, mas com isto o desempenho acaba sendo menor. Mas aí você me pergunta qual tipo de controle eu iria utilizar, Javascript ou PHP? Eu respondo que utilize o PHP, mas se utilizar os dois em conjunto, melhor ainda.

Entenda o porque de utilizar os dois métodos. Quando você implementa o Javascript, ele irá atuar diretamente no navegador como eu disse anteriormente, evitando que os dados sejam enviados para o servidor, bloqueando ali mesmo qualquer tipo de padrão que você deseja. Mas mesmo que o usuário burle o Javascript, o PHP irá agir da mesma forma, bloqueando os dados inválidos/indesejáveis.

Acho que já deu pra entender qual é o objetivo das validações né? Então vamos ao que importa, as técnicas.

Tamanho mínimo de caracteres

A função strlen() conta quanto caracteres foi passado na string e utilizando em conjunto com o IF.

<?php
$nome = $_GET['nome'];
if(strlen($nome)<=2){
 echo "Preencha o nome com no mínimo 2 caracteres.";
}else{
 echo "Seu nome \"$nome\" tem ".strlen($nome)." caracteres.";
}
?>

Aceitando somente números

A função is_numeric() verifica se o valor passado é número, independente de ser do tipo float, integer, long, etc.

<?php
$idade = $_GET['idade'];
if(!is_numeric($idade)){
 echo "Preencha a idade somente com números.";
}else{
 echo "Sua idade é ".$idade." anos.";
}
?>

Evitando espaços em branco

Utilizaremos a função strstr() que irá pesquisar na string se ela possui um espaço vazio que está entre as aspas duplas ” “. Caso ache um espao, ele entrará na primeira condição, informando o erro.

<?php
$palavra = "teste teste";
if(strstr($palavra, " ")){
 echo "A palavra não pode ter espaços.";
}else{
 echo "Você escreveu ".$palavra;
}
?>

Evitando campo vazio

Neste caso, iremos utilizar a função empty(), que verifica se o campo esta vazio, mas caso você faça o teste de enviar apenas um espaço em branco, ele irá aceitar.

<?php
$palavra = "teste";
if(empty($palavra)){
 echo "A palavra não pode estar vazia.";
}else{
 echo "Você escreveu ".$palavra;
}
?>

Validando e-mails – Método 1 (Expressão Regular)

A validação de um e-mail através de expressão regular.

<?php
$email = "teste@dominio.com.br";

if(!preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email)){
 echo "E-mail inválido.";    
}else{
 echo "Seu e-mail é ".$email;
}
?>

Validando e-mails – Método 2 (PHP)

A validação de um e-mail através do próprio filtro do PHP.

<?php
$email = "teste@dominio.com.br";

if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
 echo "E-mail inválido.";    
}else{
 echo "Seu e-mail é ".$email;
}
?>

Validando CEP

Aceita os CEPs do tipo XXXXX ou XXXXX-XXX através de expressão regular.

<?php
$cep = "55324-424";

if(!preg_match('/^[0-9]{5,5}([- ]?[0-9]{3,3})?$/', $cep)) {
  echo "CEP inválido.";
}
?>

Validando Data

Aceita somente data no formado XX/XX/XXXX através de expressão regular.

<?php
$data = "04/04/2011";
if(!preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $data)) {
 echo "Data inválida.";
}
?>

Validando Telefone

Permite a utilização de string com telefone com DDD de 2 ou 3 dígitos (inclusão do zero na frente) no formato (XXX) XXXX-XXXX.

<?php
$telefone = "(82) 5555-5555";

if(!preg_match('^\(+[0-9]{2,3}\) [0-9]{4}-[0-9]{4}$^', $telefone)){
 echo "Telefone inváildo.";
}
?>

Validando CPF

Não é a melhor forma de validar o CPF, mas em breve vou atualizar este exemplo pra uma forma mais completa.

<?php
$cpf = "111.444.777-35";

if(!preg_match("^([0-9]){3}\.([0-9]){3}\.([0-9]){3}-([0-9]){2}$", $cpf)) {
 echo "CPF inválido.";
}
?>

Acho que estas validações irão ajudar no entendimento, mostrando o caminho para validar outros tipos de dados que venham a ser necessário para os seus sites e sistemas. Eu aceito sugestões de novas validações para que eu possa incluir nestes exemplos.

Grande abraço e bons estudos!

Sou bacharel em Sistemas de Informação pela Estácio de Sá (Alagoas), especialista em Gestão Estratégica da Tecnologia da Informação pela Univ. Gama Filho (UGF) e pós-graduando em Gestão da Segurança da Informação pela Univ. do Sul de Santa Catarina (UNISUL). Certificações que possuo: EC-Council CEH, CompTIA (Security+, CySA+ e Pentest+), EXIN (EHF e ISO 27001), MCSO, MCRM, ITIL v3. Tenho interesse por todas as áreas da informática, mas em especial em Gestão e Governança de TI, Segurança da Informação e Ethical Hacking.

16 Responses to “Validação de dados no PHP”

  1. andré coxe disse:

    gostei muito desta aula

  2. andré coxe disse:

    isso é q é ensinar a validar.

  3. O deve ser assim, pq na postagem não está indo o código completo:
    while ( eregi( “[[::]]”,pesquisa, $match ) )

  4. Novo script à ser avaliado:

    <?php print( '’ ) ?>

    Expressões Regulares

    <?php
    $pesquisa = "Agora é a hora do trabalho";
    print( "A sequência de teste é: '$pesquisa'” );

    // buscar por quaisquer palavras que começam com ‘t’
    print( “Palavras que começam com ‘t’ encontradas: “);

    while ( eregi( “[[::]]”,
    $pesquisa, $match ) )
    {
    print( $match[ 1 ] . ” ” );

    // remover a primeira ocorrência de uma palavra que começa
    // com ‘t’ para encontrar outros casos na cadeia
    $pesquisa = ereg_replace( $match[ 1 ], “”, $pesquisa );
    } // end while
    ?>

  5. Olá caro amigo Diego, estou inicializando meus conhecimentos em PHP há pouco tempo, estou tentando fazer uma validação para um campo telefone, por exemplo: (XX)XXXX-XXXX, e por exemplo, se o usuário colocar um phone tipo (11)1111-1111, este campo seja inválido.
    veja este Script

    <?php
    extract($_POST);
    // determina se numero de telefone é valido e imprime
    // uma mensagem de erro se não for
    // VALIDAR TELEFONE NO SEGUINTE FORMATO: DDD33333333
    if(!preg_match('^\(+[0-9]{3}\) [0-9]{4}-[0-9]{4}$^', $phone))
    {
    print("

    Número de telefone inválido
    Um número de telefone válido deve ser na forma:
    (555)5555-5555

    Clique no botão Voltar, digite um telefone válido.
    número e reenviar.
    Obrigado.”);
    die(”
    “);//termina execução do script
    }
    ?>

    Bom é o seguinte, ele não me retorna um valor válido para a variável telefone, vc pode me dá uma dica? Espero por alguma resposta, e vou tentado aqui outros métodos. Fico muito grato por qualquer informação.

    • Diego Macêdo disse:

      Pegando o exemplo dado no post, basta você acrescentar o restante da condição. Dá uma olhada aqui no meu blog sobre “Estruturas de Controle no PHP” e procura exatamente pelo “IF” para que você possa entender realmente como funciona ele.

      Veja que só fiz acrescentar o ELSE e também retirei o espaço depois dos parênteses. Outro ajuste que fiz em relação ao seu, é que o usuário poderá especificar o DDD com 2 ou 3 caracteres, ou seja, pode incluir o 0 (zero) ou não se ele quiser. Se você quiser deixar específico, basta alterar onde tem “{2,3}” para “{3}”.

      Qualquer dúvida é só falar! Grande abraço!

  6. Heron disse:

    Olá

    Podes me ajudar?

    preciso do seguinte ao a pessoa entrar no site ela coloca sua data d nascimento e se o resultado for mais de 18 anos ela vai pro site correto caso contrário vai a outro site?

    pode me ajudar?

    • Diego Macêdo disse:

      Tem diversos algoritmos que fazem isso pela internet, mas basicamente faz com que você pegue o ano atual e subtraia o ano dado pelo visitante. Se a diferença for de 18 ou mais, só voce jogar o comando de redirecionamento dentro do IF, ou então vai cair no ELSE.

      Tenta fazer o código e postar aqui, que eu te ajudo caso não consiga. Ou até mesmo se conseguir para compartilhar com os outros visitantes. =)

  7. Rogério Paulo Flores disse:

    Ai Diego,

    Vlw pelas dicas.

Deixe um comentário para Erick Medeiros Cancelar resposta

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