Captcha en KumbiaPHP
Este Artículo esta siendo revisado por los Kumbieros. Puedes tomar la información que aqui se encuentra pero no nos hacemos responsable | {{{imageright}}} |
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 form(){
}
public 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 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 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::error("captcha valido");
else Flash::error("captcha invalido!");
}
}
ahora todo el codigo completo:
contactos_controller.php
class ContactosController extends ApplicationController {
public form(){
}
public 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::error("captcha valido");
else Flash::error("captcha invalido!");
}
}
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 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