Captcha usando o vendor PhpCaptcha
Postado por Carlitos | Tags bakery , cakephp , components , php , vendor | Postado em 18:35
0
Bom, alguns dias sem postar nada e eu procurando algo interessante para compartilhar com vocês. Vamos lá então...
Estava quebrando a cabeça para implementar um Captcha (Isso mesmo! CAPTCHA, ou seja, aquelas letrinhas todas bagunçadas que impedem que um "não-humano" consiga submeter um formulário automaticamente... se bem que as vezes até um humano não consegue identificar as letras, mas vamos lá).
Baseado neste artigo que vi no Bakery vamos utilizar o PhpCaptcha como vendor. Segue os passos:
1) Faça o download do PhpCaptcha através do link http://www.ejeliot.com/pages/2 e descompacte o arquivo em "app/vendors/phpcaptcha" (crie este diretório caso não exista).
2) Faça o download dos arquivos de fontes Vera do GNOME através do link http://ftp.gnome.org/pub/GNOME/sources/ttf-bitstream-vera/1.10/ttf-bitstream-vera-1.10.zip e descompacte o arquivo em "app/vendors/phpcaptcha/fonts/".
3) Vamos criar o componente Captcha:
<?php // Salve em app/controllers/componentes/captcha.php App::import('Vendor','PhpCaptcha' ,array('file'=>'phpcaptcha'.DS.'php-captcha.inc.php')); class CaptchaComponent extends Object { var $controller; function startup( &$controller ) { $this->controller = &$controller; } function image(){ $imagesPath = APP . 'vendors' . DS . 'phpcaptcha'.'/fonts/'; $aFonts = array( $imagesPath.'VeraBd.ttf', $imagesPath.'VeraIt.ttf', $imagesPath.'Vera.ttf' ); $oVisualCaptcha = new PhpCaptcha($aFonts, 200, 60); $oVisualCaptcha->UseColour(true); //$oVisualCaptcha->SetOwnerText('Source: '.FULL_BASE_URL); //$oVisualCaptcha->SetNumChars(6); $oVisualCaptcha->Create(); } function audio(){ $oAudioCaptcha = new AudioPhpCaptcha('/usr/bin/flite', '/tmp/'); $oAudioCaptcha->Create(); } function check($userCode, $caseInsensitive = true){ if ($caseInsensitive) { $userCode = strtoupper($userCode); } if (!empty($_SESSION[CAPTCHA_SESSION_ID]) && $userCode == $_SESSION[CAPTCHA_SESSION_ID]) { // clear to prevent re-use unset($_SESSION[CAPTCHA_SESSION_ID]); return true; } else return false; } } ?>
4) Adicione os métodos aos controllers que desejar. No caso vou adicionar ao controller Users:
<?php class UsersController extends AppController { ... // Adicione o componente Captcha ao controller var $components = array('Captcha'); ... function captcha_image(){ Configure::write('debug',0); $this->layout = null; $this->Captcha->image(); $this->render(); } // Não vou entrar no mérito do captcha com audio function captcha_audio() { $this->Captcha->audio(); } ... } ?>
5) Na view invoque o método captcha_image:
<img id="captcha" src="<?php echo $html->url('/users/captcha_image'); ?>" alt="" />
6) Agora para verificar se o usuário digitou corretamente os caracteres do Captcha usamos a função check, veja:
// Suponha que o campo texto onde o usuário preencheu os caracteres que leu // no captcha seja "captcha", então temos if(!$this->Captcha->check($this->data['User']['captcha'])){ $this->Session->setFlash('Você não preencheu corretamente as letras da imagem!'); }
Veja como fica o resultado deste captcha colorido:
Bom, espero que funcione, pois aqui funcionou. Tem outros captchas para Cake e PHP também, veja aqui.
Abração!