Diferencia entre revisiones de «Captcha en KumbiaPHP»

De KumbiaPHP Framework Wiki
m (Revertidos los cambios de 85.54.194.249 (disc.) a la última edición de Joanhey)
 
(No se muestran 3 ediciones intermedias de 3 usuarios)
Línea 80: Línea 80:
 
class ContactosController extends ApplicationController {
 
class ContactosController extends ApplicationController {
  
public form(){
+
public function form(){
  
 
}
 
}
public formresponse(){
+
public function formresponse(){
  
 
}
 
}
Línea 124: Línea 124:
 
form.phtml
 
form.phtml
 
<source lang=php >
 
<source lang=php >
<?php echo form_tag('contactos/formresponse', 'method: post' ); ?>
+
<?php
 +
  echo View::content();
 +
  echo form_tag('contactos/formresponse', 'method: post' );
 +
?>
  
 
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
 
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
Línea 155: Línea 158:
 
..
 
..
 
.
 
.
   public formresponse(){
+
   public function formresponse(){
 
      
 
      
 
     if ( $this->has_post('code') ){
 
     if ( $this->has_post('code') ){
Línea 165: Línea 168:
 
         $valid = $img->check( $this->post('code') );
 
         $valid = $img->check( $this->post('code') );
 
          
 
          
if($valid == true) Flash::error("captcha valido");
+
if($valid == true)
else Flash::error("captcha invalido!");
+
          Flash::success('Captcha valido');
 +
        else
 +
          Flash::error("Captcha invalido!");
 +
        Router::route_to('action: index');
 
   }   
 
   }   
 
}
 
}
Línea 177: Línea 183:
 
class ContactosController extends ApplicationController {
 
class ContactosController extends ApplicationController {
  
public form(){
+
public function form(){
  
 
}
 
}
public formresponse(){
+
public function formresponse(){
 
  if ( $this->has_post('code') ){
 
  if ( $this->has_post('code') ){
 
         /* verificamos si se mando form y si dentro del $_POST esta un campo llamado code
 
         /* verificamos si se mando form y si dentro del $_POST esta un campo llamado code
Línea 189: Línea 195:
 
         $valid = $img->check( $this->post('code') );
 
         $valid = $img->check( $this->post('code') );
 
          
 
          
if($valid == true) Flash::error("captcha valido");
+
if($valid == true)
 
+
          Flash::success('Captcha valido');
else Flash::error("captcha invalido!");
+
        else
 +
          Flash::error("Captcha invalido!");
 +
        Router::route_to('action: index');
 
   }
 
   }
 
}
 
}
Línea 213: Línea 221:
 
la vista form.phtml
 
la vista form.phtml
 
<source lang=php >
 
<source lang=php >
<?php echo form_tag('contactos/formresponse', 'method: post' ); ?>
+
<?php
 +
  echo View::content();
 +
  echo form_tag('contactos/formresponse', 'method: post' );
 +
?>
 
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
 
<img src='<?php echo URL_PATH . "contactos/captcha/" ?>' id='captcha' alt='CAPTCHA Img' />
 
<a tabindex="-1" style="border-style: none" href="#" title="Refresh Image"  
 
<a tabindex="-1" style="border-style: none" href="#" title="Refresh Image"  

Revisión actual del 13:19 15 feb 2019

{{#if:Import.png |}} {{#if: |}}


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