Validação de dados em PHP5 – final

Olá a todos,

Continuando e finalizando a sequência de artigos sobre validação ( veja também a parte 1, 2 e 3 ), iremos abordar a união de procedimentos na validação.

Como vimos anteriormente, todo cuidado é pouco, então quanto maior o número de testes que submetermos um dado, maior a chance de ele chegar a nós da forma que esperamos ( sem causar danos a integridade do sistema ).

Vimos que a utilização de ER é essencial, toda vez que soubermos o padrão do valor esperado. Ou seja, se sabemos que um número de telefone é da forma “3333-4444”, e que isso nunca irá mudar, teremos as ER’s como nossa arma mais forte.

Mas existem casos em que não temos idéia do que o usuáiro pode inserir em um campo. Nestes casos, uma ER não tem grande utilidade, e temos de recorrer a outros recursos, como algumas funções do próprio PHP ou MySQL/Postgree para “limpar” as informações, de modo que ela não prejudique o fucionamento do sistema. Algumas destas funções são:

  • strip_tags() , que tenta limpar ( retirar tags HTML e PHP ) e retornar uma string passada como parâmetro.
  • htmlentities() , substitui TODOS os caracteres que possuírem um correspondente html.

Unindo a utilização destas funções, ER ( quando convir, não se esqueça que para se utilizar uma ER temos de ter um padrão esperado ) e cuidado na hora de pegar valores dos arrays superglobais ( $_POST, $_GET, … ), teremos um sistema com uma boa segurança a injeção de códigos por terceiros.

Vamos então fazer uma função ( não farei uma classe pois a idéia é ser bem especifico, podendo a função ser utilizada como um método sem problemas ).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function valida( $valor, $tipo )
{
$erCPF = '/[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}/';
$erCEP = '/[0-9]{5}\-[0-9]{3}/';
$erFONE = '/(0((([0-9]{2}){2})|([0-9]{2})))?[0-9]{3,5}\-[0-9]{4}/';
$erEMAIL = '/[[:alnum:]]\@[[:alnum:]]+(\.[[:alnum:]])+/';
$erDATA = '/(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}/';
$erTEXTO = '/([a-z][A-Z])*/';//aceita somente letras
$erALPHANUM = '/[[:alnum:]]*/';//aceita numeros e letras
$erNUM = '/[0-9]*/';//aceita somente numeros
$erALL = '*';//aceita qualquer coisa
$tipo = strtoupper( trim($tipo) );
$padrao = 'er'.$tipo; //faço concatenação do prefixo 'er' com o tipo, para formar o nome da variavel com o padrao correto.
$valor = strip_tags( htmlentities(trim($valor)), '<a><b><i><p>' ); //limpo a variavel com valor, retirando possíveis funções do PHP ou tags HTML que possam ser prejudiciais ao sistema, mas permitindo algumas que podem ser uteis em determinados casos
 
if( preg_match( $$padrao, $valor ) )
{
echo 'O dado passou pela validação de padrão.<br/>';
//podemos validar melhor alguns dados
switch( $tipo )
{
case 'CPF':
if ( validaCPF( $valor ) )
echo 'O CPF é válido.';
else
{
echo 'O CPF não é valido';
return false;
}
break;
//você pode por um 'case' para cada tipo de dado que quiser validar com alguma formula especifica
default:
echo 'O dado foi validado';
break;
}
return true;
}
else
echo 'O dado não passou pela validação de padrão.<br/>';
 
return false;
}

Bom, este é um exemplo de função que poderíamos utilizar para validação de dados, podendo ser inserida em uma classe com um método dela.

Mas como utilizamos ela? Simples, veja( supondo que temos vindo de um formulário um campo email, via POST:

1
2
3
4
if( valida( $_POST['email'], 'email' ) )
echo 'Email válido';
else
echo 'Email inválido';

Fica fácil não?

Bom, nesta função, é chamada outra função ( validaCPF ), que não é de minha autoria, e que dei os devidos créditos na parte 3 desta série. Esta função implementa o algoritmo de validação do CPF, com seu digito verificador e tudo mais. É um algoritmo muito difundido, e bem documentado na internet, faça uma busca se estiver interessado no assunto. É interessante.

Função para validação de dado( veja o fonte )

É isso, espero ter ajudado, qualquer coisa, mail-me.

Até a próxima.

Validação de dados em PHP5 – Parte 3

Depois de um longo período sem nada útil, vamos continuar a série mais querida deste blog: “Validação de dados em PHP5”.

Está é a parte 3 da série, e talvez a última ( a menos que surjam pedidos ou dúvidas ) da série, se você não viu, veja: parte 1, parte 2.

Como falei na parte 2, o PHP trabalha com dois padrões de ER ( Expressões Regulares ): o padrão PCRE e o padrão POSIX. Adotaremos de agora em diante o padrão PCRE por ser recomendado pelo próprio manual do PHP.

Na última parte fizemos a validação de um número de CEP.

Agora veremos outros casos de uso, primeiro dois casos simples como o do CEP, um para validar um número de telefone ( possivelmente de celular ) e outro para validar um endereço de email – este último muito útil e utilizado, pois permite uma alta confiabilidade nos dados verificados.

Nossa ER para validar um telefone:

1
$telER =/(\([0-9]{2}\)\ )?[0-9]{4}\-[0-9]{4}/; //formato: (67) 9999-0000

Simples não é? Que tal “complicar” um pouco mais? Então compliquemos:

1
2
3
//formato: 0556733334444 ou 06733334444 ou 3333-4444
 
$telER = '/(0((([0-9]{2}){2})|([0-9]{2})))?[0-9]{3,5}[0-9]{4}/';

E como validar uma data? Fácil fácil…

1
2
3
//formato: 01/01/1001
 
$dataER = '/(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}/';

Validar um CNPJ:

1
2
3
//formato: 11.222.333/0001-01
 
$cnpjER = '/[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}\-[0-9]{2}/';

Depois que a gente começa, não da vontade de parar, mas parem mesmo assim. Agora que já viram alguns exemplos de ER, tentem fazer a de vocês mesmos. Façam uma ER para validar uma idade ( considerem que existe gente com mais de 100 anos ).

Depois de você ter feito suas ER, pode continuar…

Vamos validar um endereço de email agora:

1
2
3
//formato: nome@host.com ou nome@subhost.host.com
 
$emailER = '/[[:alnum:]]\@[[:alnum:]]+(\.[[:alnum:]])+/';

Será que já ta bom?

Não, mas chega de mostrar ER pronta para vocês, ta, uma última vez, fiz um arquivo de teste explicando algumas ER: Expressões Regulares . Espero que seja útil.

Lembrem-se que estou utilizando o padrão PCRE, então nada de usar estas expressões com as funções “ereg”.

Enquanto escrevia esta parte, pensei em algumas coisas para continuação. Então, ainda esta semana concluo.

Até.

ps.: para quem ver o arquivo e ficar curioso sobre a verificação extra do CPF, saiba que é utilizado o Algoritmo de Validação do CPF ( procure por este termo no Google ) implementado em PHP pelo Jefferson Estanislau da Silva e disponibilizado no link: http://www.vivaolinux.com.br/scripts/verScript.php?codigo=401. Fiz algumas alterações, pois no original, usava ER no padrão POSIX. Darei mais detalhes na continuação.

E os posts?

Calma, tudo ao seu tempo.

Já falei aqui que quero postar sobre Orientação a Objetos, sobre os livros que comprei recentemente, sobre o Joomla! e claro, continuar os artigos sobre validação ( afinal, temos de concluir o que iniciamos, não é? ). Meu próximo post será a continuação dos posts sobre validação. Não, eu ainda não o escrevi, mas o farei ainda hoje, mais tardar amanhã. Mas apesar de não ter escrito, já sei o que farei.

Em seguida, devo escrever um post sobre o Joomla! ( estou fazendo aquele componente que comentei anteriormente ), e está sendo uma experiência legal.

Neste meio tempo, provavelmente haverão alguns posts menos nerds, ou geek como preferirem. Minha vida acadêmica está voltando ao normal e com ela minhas responsabilidades com o Movimento Estudantil ( não, eu não fiquei a toa minhas férias e deixei tudo parado, não totalmente ). E com maior vivencia do assunto, as idéias, conflitos e reflexões vão “aflorando” e pretendo usar este espaço como válvula de escape, afinal, ninguém é de ferro – eu muito menos.

Está chegando a era da filosofia nerd neste blog ( não precisam se assustar, não serei tão incisivo, não no começo ), mas o mundo nerd não perderá mais um espaço, continuarei falando MUITO sobre programação, tecnologia ( que não comentei ainda ) e afins.

Até breve.

Novidades…

Tirei um tempinho para falar de uma coisa que acabei de ver. Como alguns já sabem, sou fã do ActionScript, ou seja, do Adobe Flash ( antes Macromedia Flash ), acho esta linguagem de programação extremamente ágil e simpática. Foi uma das primeiras linguagens de programação na qual tive contato ( na verdade, quando à conheci, ainda não era considerada uma linhagem de programação, mais ou menos na época do Flash 4 ).

No começo de meus estudos, utilizada duas fontes de conhecimento: Ponto Flash e FlashMasters . Utilizava muito o primeiro, mas devido a falta de manutenção, acabei deixando de acessar. O segundo utilizo até hoje. Mas utilizo a seção que acho a mais importante deste portal, o Fórum.

O Fórum do FlashMasters é considerado o maior fórum do assunto em lingua portuguesa, e possui muita gente de fora do país. Eu mesmo já ajudei e fui ajudado por pessoas na França e em Portugal.

Acontece que o pessoal responsável pelo portal fez uma grande mudança na estrutura dele, na verdade, mudaram tudo. Adivinhem qual o sistema que agora gerencia o conteúdo do FlashMasters? Sim, acertou quem falou Joomla! ( devo estar obcecado por este CMS, hehehe ). Parabéns a todos que fizeram as alterações, ficou excelente, tanto visualmente como em funcionalidades ( segundo o William – diretor e criador do portal -, eles tiveram ajuda da comunidade Joomla Clube ).

Este novo portal até me deu vontade de voltar a participar do Fórum, e agora também, do portal ( é possível inserir conteúdo diretamente no portal, ótima idéia ). Dentre em breve estarei colocando lá umas classes que fiz em AS3 ( ActionScript 3 ).

Caso queiram me encontrar por lá, meu usuário é “Dotti”.

—- Atualizado —-

Ingratidão, escrevi na pressa e acabei esquecendo de falar do local onde mais aprendi: IRC . Sim, o bom e velho IRC ( que alguns chamam de mIRC ). Eu utilizava a rede Brasnet. Entrava nos canais #Flash , #PHP e alguns outros menos nerds ( #Porkaria, #Bingola, #Meleca e #Oakley ). Bons tempos.

No IRC conheci alguns dos usuários e agora administradores do FlashMasters. Gente que me ajudou muito e que devo certa gratidão. Daria até para citar alguns, mas acho que não seria justo com outros que também me ajudaram muito. De qualquer forma, obrigado a todos os velhos amigos do #Flash e agora do FlashMasters.

— Atualizado Novamente —

Links corrigidos, obrigado Gelinho.

Sentiram falta?

Olá, faz quase uma semana que disse que estaria com o blog novo pronto, “zero bala”, a todo vapor ( tudo bem, eu não falei isso ). Acontece que estou com muito trabalho a fazer, aquele negócio todo de Joomla! e outros projetos. Vou fazer um breve relato do que estou fazendo, mesmo sabendo que não interessa a ninguém:

Estou trabalhando com o Joomla! 1.5RC4 ( mais precisamente a versão 9958 do SVN ), apesar de não ser uma versão final, tem se mostrado extremamente estável. Comecei hoje a me aventurar na criação de componentes, utilizando o novo framework do mesmo. A documentação está no inicio, mas já da pra fazer bastante coisa ( não que eu tenha feito ). Já comentei um pouco sobre as extensões que estou utilizando ( ou tentando utilizar ).

Me aproximei do desenvolvimento do componente Attachments, e estou tentando traduzir a sua ajuda agora ( a interface já está toda em Português, ainda precisa ser melhorada, mas já pode ser utilizada sem problemas ). Já tenho algumas idéias para inserir no componente, assim que tiver um tempinho, vou ver se consigo implementar, senão, mando para “OS CARAS” as idéias.

Descobri estes dias dois webmail: RoundCube e o Uebimiau. O primeiro tem uma interface extremamente agradável, muito prática e ágil, porém, está na versão 0.1, e logo tentando enviar um email, já esbarrei em um problema: o mostrador de envio de mensagem ( feito usando técnica assíncrona – AJAX ) ficava em loop infinito, enquanto a mensagem já havia sido enviada. O segundo, apesar de não possuir uma interface tão elaborada, é extremamente funcional. Estou até pensando em contactar o desenvolvedor para sugerir um porte ao PHP5 e orientação a objetos. Mas antes disto, estou criando um componente do Joomla! para utilizar o Uebimiau dentro de sua interface. Um detalhe legal, o Uebimiau, é um projeto de um brasileiro.

Com relação a este componente de utilização de um webmail dentro do Joomla! ( a propósito, já existe um componente para rodar o RoundCube dentro do Joomla!, mas apesar de ele se instalar sem problemas, quando tento carregar a página que deveria mostrar o sistema, a tela fica em branco ) deparei com um problema. A base de usuários do Joomla! é independente da base de usuários do webmail. Como eu poderia fazer para que eles acessassem o email sem ter de enviar uma nova senha e login? Pensei um bucado e cheguei a uma solução: Armazenar em uma tabela do banco a identificação do usuário no Joomla! e seus dados para login no webmail ( claro, tudo devidamente protegido ). Daí, ao pedir para entrar no webmail, o componente iria efetuar o login no sistema para o usuário. A principio a idéia me parece boa, vamos ver no que vai dar, preciso terminar algumas coisas. Aliás, alguém saberia me informar uma forma de se passar variáveis do tipo $_POST sem ter de declarar uma tag form do html, com os campos e seus valores? Acredito que ficaria bem mais seguro. Talvez pela biblioteca CURL do PHP dê, vou ver.

Hmm, isso me lembrou que estava fazendo uma pesquisa sobre autenticação em PHP, acho que vou escrever uma artigo a respeito ( apesar de haver vários na web, talvez eu consiga ajudar alguém abordando diferente ). Uma das coisas interessantes é a autenticação HTTP, que é uma forma segura de se barrar pessoas não autorizadas.

Sem assunto – parte 3

“Puta mundo injusto meu!” by Boça.

É como disse o sábio Boça.
Passei meu sábado e meu domingo trabalhando.
Um final de semana inteiro na frente do PC. Se fosse para outro próposito até que não teria sido tão cansativo.

Como comentei em um post anterior, estou estudando o Joomla! 1.5 e alguns componentes para ele ( JEvents, Community Builder, Hydra, uddeIM ). Estava olhando o dotProject, mas ele não atenderia as minhas necessidades facilmente, então parti somente para o Joomla!.

Incrível a facilidade de se utilizar este CMS. Seu código está muito organizado e legível. Em pouco tempo dá para se entender bem o funcionamento de tudo.

Estou enfrentando alguns problemas, uns por parte do próprio Joomla! outros por parte de alguns módulos/componentes. O hydra ( componente para administração de projetos ) não me permite acesso pelo FrontEnd, algo essencial para meu propósito, provavelmente o erro é meu, mas não consegui achar nada a respeito.
O JEvents está com vários erros. Não consegue gravar o arquivo de configurações, exibe um calendário repetidamente no frontend. Além de não permitir alterações nas configurações ( sempre ocorre um erro apontando para uma página inexistente ).
O uddeIM funciona até. O único problema são seus textos e menus, que eu não consigo achar os arquivos que o geram para alterar. Ele está gerando uma saída html errada – não coloca àspas em um valor de atributo html. Também não consigo achar onde devo fazer a tradução dos termos.
O Community Builder está quase 100%. Inclusive estou fazendo a tradução do arquvo de internacionalização para o português do Brasil. Assim que terminar, estarei disponibilizando aqui e em alguma comunidade Joomla!. Meu único problema com ele é não descobrir onde é gerado o menu que fica acima do perfil dos usuários, para retirar o primeiro botão ( que direciona para a página do Community Builder ).

Mas até que está bem, levando em conta que nunca havia usado nenhum destes sistemas e que meu está com o WAMP bem meia boca.

Se alguém tiver idéia de como arrumar estes problemas, ou souber o que estou fazendo de errado, deixe um comentário ou envie-me um email: cauanc [em] gmail [ponto] com

Sem assunto – parte 2

Diário de bordo.
Data estrelar: 3, 4 do 3 do 2 do 1.
Pavilhão nove
Quadrante treze…

Música: “Jesus Negão”, autor: desconhecido.

Mais um dia está prestes a se encerrar.
Hoje, passei boa parte do dia estudando sistemas em PHP.

Primeiro perdi minha manhã inteira configurando WAMP ( Windows XP SP2 + Apache 2.2.6 + MySQL 5.0.45 + PHP 5.2.5 ).
Instalei tudo da maneira mais simples possível ( utilizando os executáveis compilados, inclusive do PHP ), mas mesmo assim apareceu um erro. Na verdade dois erros, mas um foi, de certa forma, burrice minha – havia esquecido de copiar a dll libmysql para a pasta do Windows. Uma coisa tão besta, que a gente faz dezenas de vezes na vida, e eu consigo cometer algum erro toda vez, nunca configurei o WAMP de primeira.

O segundo erro é um problema com alguma extensão do PHP. O apache travava toda vez que tentava executar um script PHP. Algo muito estranho. Procurei no google pelo crash e só encontrei suposições. Uma delas era de que a extensão com problema era a php_mysql.dll ou php_mysqli.dll . Desativei todas as extensões do PHP e fui reativando uma a uma para descobrir qual estava causando o crash. Até que havia ativado as extensões php_mysql e php_mysqli sem que o apache travasse. Uffa, pelos menos o essencial eu tinha.
Acabou que não descobri a extensão que causava o crash, apenas que não era nem a GD, nem MySQL(i), nem PDO. Outra hora tento descobrir. Aliás, vi em um fórum na web, um cara com problema na extensão PDO para mysql, não respondi no fórum porque necessitava cadastro, e o tópico parecia bem antigo, mas o problema dele era a falta da extensão PDO ( a extensão genéria PDO, ela tem que ser carregada para que se carregue as extensões específicas, como a do mysql ).

Enquanto cedia o computador para outras pessoas, retomei a leitura do livro que chegou recentemente.
Estou gostando da leitura. O 1º capitulo aborda várias funções do PHP. O 2º capitulo já explica Orientação Objetos. De modo geral, tudo é muito bem explanado e possui exemplos.
Sinceramente, só não gostei muito da parte que aborda o Polimorfismo. Achei o assunto meio vago, talvez pela falta de suporte do PHP.

Falando em Orientação a Objetos, estou com umas idéias em mente. Penso em escrever um pouco sobre o tema aqui, não vou perguntar a opinião de vocês por que sei que não existe o “vocês”, hehehe. Mas gostaria de estar escrevendo sobre Programação Orientada Objetos, de forma bem genérica, usando exemplos em várias linguagens – C++, Java, PHP, ActionScript. Quem sabe nesta próxima semana não me inspiro.

A, esqueci de dizer quais sistemas em PHP eu estudei durante a manhã, foram eles: Joomla! 1.5 e dotProject . Sistemas excelentes, sob licença GPL. Recomendados. Se você programa, ou é fluente em Inglês-Português, pode ajudar estes projetos, um grande aprendizado ( é, eu tenho que fazer isso também ).

Até.

Validação de dados em PHP5 – Parte 2

Continuando a série de artigos sobre validação de dados ( veja a primeira parte ) com PHP5.

Nota: usarei “cliente” para me referir a um usuário do sistema, ou mesmo outro sistema que interaja conosco. Usarei também ER para designar expressão regular, que é o assunto base deste post.

Anteriormente, havíamos abordado uma validação mais geral, onde tínhamos de aceitar vários tipos de dados.

Agora, vamos abordar uma situação onde esperamos um dado específico vindo do cliente – usarei “cliente” para referir tanto ao usuário do sistema quanto outros sistemas – por exemplo, em um campo de formulário, onde esperamos um nome ou um email.

Um dos recursos mais eficientes em se tratando de validação é o uso de expressões regulares. E é com isto que iremos trabalhar.

Vamos a uma definição:

“Uma expressão regular, na Informática, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.” Fonte: Wikipédia.

Então uma expressão regular é um padrão. Por isso não podemos utilizar uma expressão regular para validar algo que desconhecemos, porque seria muito difícil ou mesmo impossível encontrar um padrão para tudo.

Não pretendo explicar os fundamentos de uma expressão regular, se desejar alguma referência, recomendo o site: http://guia-er.sourceforge.net

Como podemos utilizar uma expressão regular para validar um campo de um formulário? Precisamos de uma função do PHP que faça esta verificação para a gente, uma função que compare nossa expressão regular com o valor a ser testado.

O PHP oferece algumas funções para isso, vejamos duas delas:

 

ereg( string $expressão , string $variável [, array $registros ] )

 

Retorna TRUE se $variável “bater” com $expressão, e FALSE se a expressão não casar ou se acontecer algum erro. referência

//nossa ER, um padrão para CEP
$cepER = ‘^[0-9]{5}\-[0-9]{3}$’;
//vamos supor que temos a variável $_POST[‘cep’] vinda de um formulário

//fazemos então a verificação
if( ereg( $cepER, $_POST[‘cep’] ) )
echo “Isso parece um CEP válido”;
else
echo “Isso não é um CEP válido”;

Por que não podemos afirmar se o CEP está correto? Simplesmente porque com a ER analisamos apenas a forma da variável, ou seja, se ela tem o mesmo número de caracteres, se são do mesmo tipo e estão nas mesmas posições. Para afirmarmos com segurança que o CEP é válido, teríamos de verificar se o valor está cadastrado nos Correios ou em alguma outra fonte segura. Mas isso foge ao nosso escopo.

Essa função ereg permite fazer a buscar por um padrão em uma string utilizando padrão POSIX, mas o PHP fornece outra função para a mesma tarefa, com desempenho melhor, e baseado no padrão PCRE ( compatível com PERL ). Esta função é a preg_match.

preg_match( string $expressão , string $variável [, array &$matches [, int $flags [, int $offset ]]] )

Retorna 1 se a $variável “bater” com a $expressão, e 0 caso contrário. referência.

Vamos ver o uso do preg_match na mesma situação do exemplo anterior:

//nossa ER, um padrão para CEP
$cepER = ‘/[0-9]{5}\-[0-9]{3}/’;

//vamos supor que temos a variável $_POST[‘cep’] vinda de um formulário
//fazemos então a verificação, poderíamos omitir o “== 1”, já que o PHP converte 0 e 1 para false e true respectivamente
if( preg_match ( $cepER, $_POST[‘cep’] ) == 1 )
echo “Isso parece um CEP válido”;
else
echo “Isso não é um CEP válido”;

Notem a diferença na nossa ER. Mudamos os caracteres de inicio e final, isto acontece por conta da diferença entre os padrões que as funções utilizam.

O artigo já está muito grande, continuarei a falar sobre ER nos próximos artigos. Vamos ver como criar ER para validar telefone, email e por último CPF ( que incluiremos outro teste de validação além da ER ).

Uma última dica, utilizem ER juntamente com o método do artigo anterior, para aumentar a segurança de seu sistema ( pense em outras formas para isso também ).

Por enquanto é só.

Não esqueçam de validar tudo.

Sem assunto

Um dia quente, muito quente.

Sem nada interessante pra fazer. Podia estar a beira de uma praia, rio, piscina ou qualquer fonte de água. Mas não, estou em casa, dentro de um quarto quente, em frente a um computador procurando algo interessante. Sem sucesso.

Acaba de chegar um livro nerd que comprei: PHP Programando com Orientação a Objetos … me pareceu muito interessante, já dei uma folheada, mas neste calor, não tem como ficar lendo. Não tenho ar-condicionado.

Pelo menos uma coisa boa aconteceu hoje, entrei no internet banking e fui ver meu saldo. Adivinhem, meu pouco dinheiro não está sendo tributado pela CPMF, pois é, como é sabido pela maioria, desde o dia 1º de Janeiro de 2008 estamos livres desta extorsão, vamos ver quanto tempo isso dura. Na verdade já não dura muito, porque o IOF e outros impostos foram aumentados, nada que tenha o mesmo efeito que a CPMF tinha, mas já estão arrumando um jeito de não perder o peixe.

Segundo um instituto aí de estudos tributários ( não me lembro onde li, acho que no Terra ), os encargos pagos em média por uma pessoa com a CPMF era de 200 reais ao ano, sim, isso só da CPMF, fora o resto dos impostos. Agora com o IOF maior, vamos pagar em média 40 reais no ano. Melhorou, mas ainda tem muito para melhorar.

Falta um pouco de interesse da população, um pouco de vontade política e de cunho social. Falta vergonha na cara para exigir o que é seu.

Bom, falei tudo isso porque está quente. Muito quente.

Validação de dados em PHP5 – Parte 1

Olá a todos, nesta série de artigos ( espero eu ) estarei dando algumas dicas de como tratar valores com o PHP.

Uma preocupação cada vez maior ao se criar sistemas é a segurança, e um das áreas em que devemos ter maior preocupação é na hora de usar informações provenientes de agentes externos ( pessoas ou outros sistemas ).

Temos de levar sempre em consideração que nunca poderemos prever todas as maneiras que um usuário ( ou mesmo outro sistema ) utiliza nosso código. Os usuários sempre arrumam uma forma “inovadora” de usar nossos sistemas, podendo causar falhas críticas no mesmo. Então, sempre que for criar um sistema que interaja com alguém, proteja-se de todas as maneiras possíveis, e dependa o mínimo possível de fatores externos ( como boa vontade e conhecimento do usuário, ou que o sistema alheio não falhe ).

A palavra de ordem é: “Valide TUDO”. Sim, qualquer coisa que venha de fora de seu sistema tem de passar por validação. Seja um valor utilizado para atribuição à variável, seja para uma consulta à um banco de dados, tudo deve ser validado.

Nesta primeira parte, falarei sobre o tratamento de variáveis vindas do cliente ( usuário ou sistema ) pelos arrays superglobais $_POST e $_GET, e que não sabemos ao certo o que esperar ( ou seja, podemos utilizar este método para receber um nome, telefone, email, data ou qualquer outro dado suportado pelo PHP ).

Abaixo segue um método que utilizo para tratar estes valores:

public function __set( &$atributo, $valor )
{
//Testa se existe algum valor a ser utilizado na atribuição
if( !empty($valor) )
{
//Faz a conversão de tipo, como o PHP tem uma tipação fraca ( ou seja, deixa você atribuir uma String em um váriavel que tinha um Número ), isto pode ajudar.
settype( $valor, gettype($atributo) );

//Verifico se magic_quotes_gpc está ativo na configuração do PHP, isto será removido no PHP 6( veja sobre isto )
if (!get_magic_quotes_gpc())
//Adiciono caracter de scape em tudo o que possa ser perigoso ( veja mais sobre isso )
$valor = addslashes($valor);
//Faço a atribuição normalmente.
$atributo = $valor;
}
}

Este é um método que pode ser incluído em qualquer classe. Ele possui um nome especial “__set”, que para o PHP, indica que ele será usado toda vez que for feita uma atribuição de valor para um atributo da classe ( posso falar mais sobre os métodos especiais do PHP5 em um próximo post ).

Por exemplo, quando utilizarmos o comando abaixo, atribuindo o valor nome do array $_GET ao atributo nome de nossa classe:

$classe->nome = $_GET[‘nome’];

O PHP interpretará como:

$classe->__set( nome, $_GET[‘nome’] );

 

e fará todas as verificações que contém no método.

Podemos utilizar outras funções de validação em nosso método, mas temos de tomar cuidado para não restringir demais os dados, lembrando sempre que esta validação será usada TODA vez que fizermos uma atribuição.

Poderíamos por exemplo refinar nossa validação utilizando expressões regulares, mas isso provavelmente não lhe traria bons resultados, pois uma expressão regular define uma regra que deve ser seguida, e no nosso caso, nós não sabemos o que esperar, então como poderia impor uma regra? Perderíamos muitos dados corretos utilizando uma expressão regular ( a menos que ela fosse pouco restritiva, o que faria perder sua função ).

 

Por enquanto é isto.

Espero ter ajudado, e até a próxima.