Mostrando postagens com marcador PHP. Mostrar todas as postagens
Mostrando postagens com marcador PHP. Mostrar todas as postagens

terça-feira, 14 de abril de 2015

Captcha em PHP

Olá amigos do Preciso Estudar Sempre. Hoje, iremos falar sobre captcha mas, você sabe o que é uma captcha ?

Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) é um teste de desafio cognitivo para diferenciar homens de máquinas. Isto é usado no combate a bots de sistemas. O teste consiste em uma imagem com letras e números distorcidas em que, o usuário do sistema deve dar seu melhor palpite sobre a imagem. Existem algumas implementações de captcha que disponibilizam a opção de emissão de sons para que, o usuário escreva o que ouviu ou até, a escolha de imagens de acordo com um padrão.

Para que você possa ter seu próprio captcha é bem fácil. O google disponibiliza uma API a qual, é muito simples de usar e o resultado final fica bastante legal.

Se você me perguntasse em qual linguagem eu prefiro implementar o captcha, eu te responderia que prefiro no PHP, sem sobras de dúvidas. Essa escolha acontece pelo fato que é muito mais fácil do que fazer com Java e o PHP possui suporte nativo a JSON o que, torna-o muito atrativo para tal tarefa.

captcha.html

 <!DOCTYPE html>  

 <html> 
  <head> 
   <title>Google recapcha demo - Preciso Estudar Semprelt;/title> 
   <script src='https://www.google.com/recaptcha/api.js'></script> 
  </head> 
  <body> 
   <h1>Google reCAPTHA Demo</h1> 
   <form id="comment_form" action="" method="post"> 
    <input type="email" placeholder="Type your email" size="40"><br><br> 
    <textarea name="comment" rows="8" cols="39"></textarea><br><br> 
    <input type="submit" name="submit" value="Post comment"><br><br> 
    <div class="g-recaptcha" data-sitekey="sua-chave-aqui"></div> 
   </form> 
  </body> 
 </html> 

Você deve ter notado algumas coisas no código. A importação da biblioteca api.js é necessária visto que, ela é a responsável pela criação da captcha e de todos os seus controles. Note também que eu criei uma div com o atributo class preenchido com o valor g-recaptcha. Isto também é necessário pois, é com o atributo class que a API do google irá localizar a div para inserir a captcha. Por último, você também notou o atributo data-sitekey na div. Esse atributo segue a especificação do HTML 5 de criação dinâmica de atributos, ou seja, eu posso criar qualquer atributo em uma tag de forma dinâmica simplesmente iniciando seu nome com a palavra "data-". A partir daí, eu posso trabalhar como se fosse um atributo comum.

Neste atributo (data-sitekey) é definido a chave pública para o captcha.

Chaaave pública ????

Sim, chave pública. A API do google funciona dessa forma. Você cadastra seu domínio no google developer e recebe uma chave pública e outra secreta. Essas chaves são usadas para você fazer a checagem se o que o usuário digitou condiz com a imagem.

Para cadastrar seu domínio e conseguir suas chaves, clique aqui.

Com suas chaves em mão, preencha o atributo data-sitekey com sua chave pública. É possível também gerar o captcha via codificação javascript mas, não utilizaremos essa abordagem. Caso você queira mais exemplos, clique aqui para ver a documentação da Google. Via codificação é possível customizar certos elementos da captcha como: definir função de callback após o preenchimento, definir função caso a captcha expire, realizar internacionalização, mudanças de temas, definição de tipo da captcha (audio ou vídeo) e etc.

Vamos realizar agora a implementação server-side que precisamos. Caso você não tenha nenhuma experiência com PHP, dê uma olhada nesse post em que realizamos uma iniciação no assunto.

Crie o arquivo Form.php.

 <?php   

      $email; 
      $comment; 
      $captcha; 

      if(isset($_POST['email'])){ 
       $email=$_POST['email']; 
      }if(isset($_POST['comment'])){ 
       $email=$_POST['comment']; 
      }if(isset($_POST['g-recaptcha-response'])){ 
       $captcha=$_POST['g-recaptcha-response']; 
      } 

      if(!$captcha){ 
       echo '<h2>Please check the the captcha form.</h2>'; 
       exit; 
      } 

      $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=sua_chave_secreta_aqui&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']));      
      if($response->success==false){ 
       echo '<h2>Você é um spammer ! Zarpa daqui !!!</h2>'; 
      } else { 
       echo '<h2>Obrigado pelo comentário.</h2>'; 
      }  
 ?> 

Algumas observações sobre o código acima:
  • O parâmetro g-recaptcha-response representa o que foi respondido pelo usuário.
  • Realizamos um acesso à url https://www.google.com/recaptcha/api/siteverify para verificar se o que foi escrito pelo usuário condiz com o apresentado. Passamos como parâmetros a nossa chave secreta, o que foi respondido pelo usuário e o nosso ip. O nosso ip tem de ser enviado para realizar a validação se o acesso está sendo feito via localhost ou pelo domínio. Acessos via localhost são permitidos afim de testes.
  • A função json_decode é utilizada porque o que é retornado pelo acesso à url é um objeto JSON. Este objeto possui dois atributos: success e error-codes. Para mais informações, clique aqui.
Caso o atributo retorne true então a verificação obteve sucesso e o usuário deu o palpite certo sobre o captcha mas, se retornar false pode ser que o usuário tenha errado o palpite ou, seja um spammer.

IMPORTANTE: Testes feitos em ambiente de localhost sempre irão resultar em sucesso pois, não existe como você ser um spammer.

Pronto, nossa implementação de PHP + Captcha está pronta. Agora, é só usar !!

Para baixar o projeto pronto, clique aqui.

Sugestões ?! Críticas ?! Elogios ?! 

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
CAPTCHA - http://pt.wikipedia.org/wiki/CAPTCHA
Google Captcha - https://www.google.com/recaptcha/intro/index.html
Um primeiro contato: PHP - http://precisoestudarsempre.blogspot.com.br/2015/03/um-primeiro-contato-php.html
Leia Mais ››

sexta-feira, 13 de março de 2015

Um primeiro contato: PHP

Bem vindo ao Preciso Estudar Sempre. O tema dessa semana será algo nunca visto aqui antes. Hoje falaremos de uma linguagem de programação a qual, não é Java. Hoje, falaremos de PHP mas, porque PHP ? Porque essa mudança agora ? Bem, vamos às respostas !

Pergunta: porque PHP ?
Resposta: Escolhi PHP porque é uma linguagem que é muito usada, rápida, fácil e poderosa. Já faz tempo que eu quero aprender e falar sobre PHP.

Pergunta: Porque essa mudança agora ?
Resposta: Resolvi realizar essa mudança para que todos nós possamos aprender coisas novas visando, adicionar ao nosso canivete novos conhecimentos.

Para quem não está se aguentando, clique aqui e baixe o projeto.

Não fique achando que você terminará de ler esse post e será considerado um expert PHP. O que iremos abordar aqui é um exemplo simples. O começo da estrada do aprendizado.

O PHP é uma linguagem de programação que não é compilada, é interpretado. Você escreve seu código e põe ele no servidor de aplicações e pronto ! Está funcionando !

Com isso, nosso processo de desenvolvimento será mais rápido que o Java. O servidor de aplicações é o responsável por analisar o que escrevemos e interpretar os comandos utilizados. O PHP em sua versão 5 oferece suporte a orientação à objetos. Porém, ela não foi feita para ser OO. Existe uma grande diferença entre você ter uma linguagem que nasceu OO e uma linguagem que oferece suporte à OO.

OBS.: Para falar de OO, usaremos o Java como exemplo.

Enquanto no Java, você é obrigado a criar no mínimo uma classe com um método para começar a trabalhar, no PHP você não precisa disso. Basta somente, criar um arquivo com extensão .php, abrir um editor de texto qualquer e começar a programar ali. Obviamente que existem vantagens e desvantagens. O Java é fortemente OO e compilado, ele te oferece uma organização e uma estrutura bem definida mas, o desenvolvimento no PHP é muito mais rápido mas, você abre mais brechas à uma programação mal feita.

Desapegue da idéia da linguagem perfeita. Isso não existe. Em TI não existem balas de prata.

Para começarmos a desenvolver em PHP, precisaremos das ferramentas abaixo:
  • Um editor de texto (Sublime Text).
  • Um programa que tenha servidor de aplicações, banco de dados e administração de dados (WAMP ou EasyPHP). Eu uso o EasyPHP.
  • Um navegador.
IMPORTANTE: Se você já tiver o MySQL instalado na sua máquina, você vai precisar terminar o processo dele para que o WAMP ou o Easy possa levantar seu próprio processo do MySQL. Se você não fizer isso o WAMP ou Easy não vai conseguir realizar o start.

Vamos por mãos à obra.

Crie uma pasta na pasta de projetos da ferramenta (WAMP ou Easy) e escolha um nome para o seu projeto. Caso seja o WAMP é a pasta www, caso seja o Easy é a pasta projects.

Pasta de projetos
O projeto PHP
Dentro da pasta do projeto crie três pastas: controller, view e model.

Pacotes do projeto
Dentro da pasta controller, crie o arquivo Controller.php, dentro da pasta view, crie a página pagina.html e dentro da pasta model crie o arquivo Cliente.php.

pagina.html
 <!DOCTYPE html>  
 <html> 
 <head> 
      <title>Preciso Estudar Sempre</title> 
 </head> 
 <body> 
      <form method="POST" action="../controller/Controller.php">           
           <div>               
                <label for="nome">Nome</label> 
                <input type="text" name="nome" /> 
           </div> 
           <div>               
                <label for="email">Email</label> 
                <input type="text" name="email" /> 
           </div> 
           <div>               
                <label for="dtNascimento">Data de nascimento</label> 
                <input type="text" name="dtNascimento" /> 
           </div> 
           <div>               
                <label for="rg">RG</label> 
                <input type="text" name="rg" /> 
           </div> 
           <div>               
                <label for="cpf">CPF</label> 
                <input type="text" name="cpf" /> 
           </div> 
           <input type="submit" value="Confirmar" /> 
      </form> 
 </body> 
 </html> 

Cliente.php
 <?php   

 /** 
 *  
 */ 
 class Cliente { 
      private $id; 
      private $nome; 
      private $email; 
      private $dtNascimento; 
      private $RG; 
      private $CPF; 

      function __construct() { } 

      public function getId(){ 
           return $this->id; 
      } 

      public function setId($id){ 
           $this->id=$id; 
      } 

      public function getNome(){ 
           return $this->nome; 
      } 

      public function setNome($nome){ 
           $this->nome=$nome; 
      } 

      public function getEmail(){ 
           return $this->nome; 
      } 

      public function setEmail($email){ 
           $this->email=$email; 
      } 

      public function getDtNascimento(){ 
           return $this->dtNascimento; 
      } 

      public function setDtNascimento($dtNascimento){ 
           $this->dtNascimento=$dtNascimento; 
      } 

      public function getRG(){ 
           return $this->RG; 
      } 

      public function setRG($RG){ 
           $this->RG=$RG; 
      } 

      public function getCPF(){ 
           return $this->CPF; 
      } 

      public function setCPF($CPF){ 
           $this->CPF=$CPF; 
      } 
 } 
  ?> 

Controller.php
 <?php   

 /** 
 *  
 */ 
 require_once("../model/Cliente.php"); 

 class Controller { 

      function __construct() { } 

      public function exibirDados(){ 
           $cliente = $this->construirCliente($_REQUEST); 
           echo "<h1>Dados do cliente</h1> <br/>"; 
           echo "Id: " . $cliente->getId() . "<br/>"; 
           echo "Nome: " . $cliente->getNome() . "<br/>"; 
           echo "Email: " . $cliente->getEmail() . "<br/>"; 
           echo "Data de nascimento: " . $cliente->getDtNascimento() . "<br/>"; 
           echo "RG: " . $cliente->getRG() . "<br/>"; 
           echo "CPF: " . $cliente->getCPF() . "<br/>"; 
      } 

      public function construirCliente($request){ 
           $cliente = new Cliente();           
           $cliente->setId(1); 
           $cliente->setNome($request['nome']); 
           $cliente->setEmail($request['email']); 
           $cliente->setDtNascimento($request['dtNascimento']); 
           $cliente->setRG($request['rg']); 
           $cliente->setCPF($request['cpf']); 
           return $cliente; 
      } 
 } 
 $controller = new Controller(); 
 $controller->exibirDados(); 
  ?> 

Vamos às explicações !!

Você já deve estar irritado com o $ em todo o canto no código. Isso acontece porque em PHP as referências à variáveis são feitas com o cifrão, ou seja, toda variável ou atributo deve usar o cifrão. Outra coisa que você deve ter reparado foi a seta usada. A seta (->) é usada para acesso de métodos e atributos, é igual ao ponto (.) do Java.

Em Java: meuObjeto.foo();

Em PHP: $meuObjeto->foo();

IMPORTANTE: PHP não é case sensitive, ou seja, acessar o método getNome ou getnome resulta na mesma coisa.

O construtor da classe é representado function __construct() { } e ele se comporta como um construtor qualquer. Porém, PHP não suporta sobrecarga logo, você não conseguirá criar vários construtores e métodos com o mesmo nome.

Outro ponto peculiar é no uso do comando echo. Este comando serve para imprimir informações. O ponto serve para realizar a concatenação dos dados assim como, o + é usado no System.out.println do Java.

Para acessar elementos da própria classe, ou seja, atributos e métodos, deve-se usar o $this->meuMetodo ou $this->meuAtributo. Isto acontece porque o PHP não consegue associar automaticamente que, chamadas à metodos ou atributos que não são precedidos de um objeto são da própria classe ou de uma superclasse.

Como é possível concluir, é necessário muito pouco para criar um projeto php e muito pouco para realizar seu deploy. Espero que este post tenha sido um ótimo guia introdutório para o desenvolvedor que nunca teve contato com a linguagem.

Sugestões ?! Críticas ?! Elogios ?! 

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
http://php.net/docs.php - Documentação oficial do PHP
http://www.w3schools.com/php/default.asp
Leia Mais ››