Captcha en KumbiaPHP

De KumbiaPHP Framework Wiki
Saltar a: navegación, buscar


Captcha es el acrónimo de Completely Automated Public Turing test to tell Computers and Humans Apart (Prueba de Turing pública y automática para diferenciar máquinas y humanos).


Se trata de una prueba desafío-respuesta utilizada en computación para determinar cuándo el usuario es o no humano. Muy Util para preservar las seguridad en formularios web, puesto que con este mecanismo evitamos que scripts externos puedan enviar datos al action de tu form, inclusive de manera ciclica, ocasionando una malautilizacion de tu form.


Existe una libreria opensource llamada secureimage http://www.phpcaptcha.org, que te provee clases para generar captcha y agregarlo a tus formularios.


y Con este tutorial lo que se pretende es integrar secureimage con la version 1.0 de kumbia Framework (spirit)


Kumbia Spirit viene con muchos vendors ( libreria desarrolladas por terceros utilizadas en kumbia ) en ( core/vendors/ ) como phpmailer, fpdf, excel etc.


Basta de Blah Blah , y manos a la obra. :)


Descargar de Securimage 2.0 BETA la ultima version de secureimage en este momento es version 2.0 beta esta en zip y en targ.gz

Creeamos la carpeta: core/vendors/secureimage

Dentro de la carpeta Descomprimir el contenido (carpetas y archivos) del compreso que hemos descargado, debe quedar asi:

core/vendors/secureimage/audio

core/vendors/secureimage/backgrounds

core/vendors/secureimage/gdfonts

core/vendors/secureimage/list

core/vendors/secureimage/words

...

..

.


Luego creamos lo que llamaria un gateway de acceso al vendors pues gracias a esto podemos cargar un vendor cualquiera en nuestra aplicacion

creamos nuevamente la carpeta secureimage esta vez en core/libs/ nos queda core/libs/secureimage/

dentro de esta carpeta crear un archivo php con el mismo nombre deberia quedar asi: core/libs/secureimage/secureimage.php


este archivo debe tener el contenido siguiente:

require_once CORE_PATH . 'vendors/secureimage/securimage.php';

come ven es un gateway :)

luego en mi boot.ini que esta en: app/config/

[modules]
libs = logger, secureimage 

ahora en nuestro controller contactos_controller.php:

class ContactosController extends ApplicationController {
 
public function form(){
 
}
public function formresponse(){
 
}
 
 
public function captcha (){
	$img = new securimage();	
 
	$img->wordlist_file =  CORE_PATH . 'vendors/secureimage/words/words.txt' ;		
	$img->signature_font = CORE_PATH . 'vendors/secureimage/AHGBold.ttf' ;
	$img->ttf_file = CORE_PATH . 'vendors/secureimage/AHGBold.ttf' ;
	$img->audio_path = CORE_PATH . 'vendors/secureimage/AHGBold.ttf';
 
	$img->show(''); 
	$this->render (NULL, NULL);
	}
 
}

explico un poco el codigo: instanciamos un objecto de class secureimage y modificamos las rutas de acceso a sus archivos (defuentes y words ) que por defecto son de las misma carpeta. como por ejemplo:

$img->wordlist_file =  CORE_PATH . 'vendors/secureimage/words/words.txt' ;		

ahora:

$img->show('');

Devuelve una imagen con headers y todo eso asi que

$this->render (NULL, NULL);

evita que se convierta en una salida xhtml provocando una salida de error


ahora en nuestra vista

form.phtml

<?php
  echo View::content();
  echo form_tag('contactos/formresponse', 'method: post' );
?>
 
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
 
<a tabindex="-1" style="border-style: none" href="#" title="Refresh Image" 
onClick="document.getElementById('captcha').src = '<?php echo URL_PATH . "contactos/captcha/" ?>'+ Math.random(); return false">
<?php echo img_tag( "refresh.gif", "alt: Reload Image", "onClick: 'this.blur()' ", "border: 0" ) ?>
</a> 
<br>
<?php echo text_field_tag('code', 'size: 15'); 
      echo submit_tag("Enviar" );
      echo end_form_tag();
 ?>

el tag html img con id='captcha' es donde se genera la imagen captcha cuyo source es el action de mi controlador


un archivo "refresh.gif" debe estar en public/img/ esta imagen es para poder refrescar la imagen sin necesidad de cargar nuevamente el formulario. es que a veces realmente no se notan las letras del captcha generado.

el textfield "code" sera donde se ingresa las letras de la imagen captcha generada. Como vemos nuestro form con el captcha apunta al action 'contactos/formresponse' donde estara la validacion del codigo captcha generado

class ContactosController extends ApplicationController {
...
..
.
   public function formresponse(){
 
    if ( $this->has_post('code') ){
        /* verificamos si se mando form y si dentro del $_POST esta un campo llamado code
        */
        // instanciamos secureimage y validamos si el code enviado es valido 
        $img = new Securimage();        
 
        $valid = $img->check( $this->post('code') );
 
	if($valid == true)
          Flash::success('Captcha valido');
        else
          Flash::error("Captcha invalido!");
        Router::route_to('action: index');
   }   
}

ahora todo el codigo completo:

contactos_controller.php

class ContactosController extends ApplicationController {
 
public function form(){
 
}
public function formresponse(){
 if ( $this->has_post('code') ){
        /* verificamos si se mando form y si dentro del $_POST esta un campo llamado code
        */
        // instanciamos secureimage y validamos si el code enviado es valido 
        $img = new Securimage();        
 
        $valid = $img->check( $this->post('code') );
 
	if($valid == true)
          Flash::success('Captcha valido');
        else
          Flash::error("Captcha invalido!");
        Router::route_to('action: index');
   }
}
 
 
public function captcha (){
	$img = new securimage();	
 
	$img->wordlist_file =  CORE_PATH . 'vendors/secureimage/words/words.txt' ;		
	$img->signature_font = CORE_PATH . 'vendors/secureimage/AHGBold.ttf' ;
	$img->ttf_file = CORE_PATH . 'vendors/secureimage/AHGBold.ttf' ;
	$img->audio_path = CORE_PATH . 'vendors/secureimage/AHGBold.ttf';
 
	$img->show(''); 
	$this->render (NULL, NULL);
	}
 
}

la vista form.phtml

<?php
  echo View::content();
  echo form_tag('contactos/formresponse', 'method: post' );
?>
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
<a tabindex="-1" style="border-style: none" href="#" title="Refresh Image" 
onClick="document.getElementById('captcha').src = '<?php echo URL_PATH . "contactos/captcha/" ?>'+ Math.random(); return false">
<?php echo img_tag( "refresh.gif", "alt: Reload Image", "onClick: 'this.blur()' " ) ?>
</a> 
<br>
<?php echo text_field_tag('code', 'size: 15'); 
      echo submit_tag("Enviar" );
      echo end_form_tag();
?>

Espero que les sirva como a mi me sirvio

JIM