Captcha de seguridad en cakePHP con Securimage

Captcha de seguridad en cakePHP con Securimage

Lo primero algo de teoría..

¿Qué es Securimage?

Securimage es un código abierto libre script PHP CAPTCHA para la generación de imágenes complejas y códigos CAPTCHA para proteger las formas de spam y el abuso. Se puede añadir fácilmente en los formularios existentes en su sitio web para proporcionar una protección contra los robots de spam. Se puede ejecutar la mayoría en cualquier servidor web, siempre y cuando usted tiene PHP instalado, y el apoyo de GD en PHP. Securimage hace todo, desde la generación de las imágenes CAPTCHA para validar el código escrito.

Características

* Mostrar una imagen en sólo 3 líneas de código
* Validar presentado las entradas en menos de 6 líneas de código
* Longitud del código personalizable
* Personalizable conjuntos de caracteres
* Soporte de fuentes TTF
* Utilice fuentes personalizadas GD cuando TTF no está disponible
* Fácil de añadir imágenes de fondo
* Múltiples colores, distorsionada, opciones de texto y transparente
* Personalizable Flash para transmitir audio en MP3 de código CAPTCHA
* Utilice una lista de palabras para la generación de códigos

Fuente: http://www.phpcaptcha.org/

Ahora la receta para crear el captcha de seguridad e integrarlo con CakePHP

Lo primero descarga las librerías, fuentes, fondos, etc de SegureImage, he indicado la fuente de la url anteriormente o bien descargar de mi servidor la versión 2.01 a día de hoy la versión estable.

[download id=”7″ format=”4″ autop=”false”]

Descomprimerlo y guárdalo en /app/vendors/securimage/

Después hay que crear el componente.

Crea el siguiente archivo /app/controllers/components/captcha.php con el código indicado
Si estas usando cakephp 1.2 no tendrás que hacer nada.
Si estas usando cakephp 1.1 tendrás que des-comentar y comentar las siguientes lineas respectivamente

//vendor('securimage'.DS.'securimage'); //use this with the 1.1 core
App::import('Vendor','Securimage' ,array('file'=>'securimage'.DS.'securimage.php')); //use this with the 1.2 core
<?php

/**
 * Securimage-Driven Captcha Component
 * @author debuggeddesigns.com
 * @license MIT
 * @version 0.1
 */

//cake's version of a require_once() call
//vendor('securimage'.DS.'securimage'); //use this with the 1.1 core
App::import('Vendor','Securimage' ,array('file'=>'securimage'.DS.'securimage.php')); //use this with the 1.2 core

//the local directory of the vendor used to retrieve files
define('CAPTCHA_VENDOR_DIR', APP . 'vendors' . DS . 'securimage/');

class CaptchaComponent extends Object {

    var $controller;

    //size configuration
    var $_image_height = 75; //the height of the captcha image
    var $_image_width = 350; //the width of the captcha image

    //background configuration
    var $_draw_lines = true; //whether to draw horizontal and vertical lines on the image
    var $_draw_lines_over_text = false; //whether to draw the lines over the text
    var $_draw_angled_lines = true; //whether to draw angled lines on the image

    var $_image_bg_color = '#ffffff'; //the background color for the image
    var $_line_color = '#cccccc'; //the color of the lines drawn on the image
    var $_line_distance = 15; //how far apart to space the lines from eachother in pixels
    var $_line_thickness = 2; //how thick to draw the lines in pixels
    var $_arc_line_colors = '#999999,#cccccc'; //the colors of arced lines

    //text configuration
    var $_use_gd_font = false; //whether to use a gd font instead of a ttf font
    var $_use_multi_text = true; //whether to use multiple colors for each character
    var $_use_transparent_text = true; //whether to make characters appear transparent
    var $_use_word_list = false; //whether to use a word list file instead of random code

    var $_charset = 'ABCDEFGHKLMNPRSTUVWYZ23456789'; //the character set used in image
    var $_code_length = 5; //the length of the code to generate
    var $_font_size = 45; //the font size
    var $_gd_font_size = 50; //the approxiate size of the font in pixels
    var $_text_color = '#000000'; //the color of the text - ignored if $_multi_text_color set
    var $_multi_text_color = '#006699,#666666,#333333'; //the colors of the text
    var $_text_transparency_percentage = 45; //the percentage of transparency, 0 to 100
    var $_text_angle_maximum = 21; //maximum angle of text in degrees
    var $_text_angle_minimum = -21; //minimum angle of text in degrees
    var $_text_maximum_distance = 70; //maximum distance for spacing between letters in pixels
    var $_text_minimum_distance = 68; //minimum distance for spacing between letters in pixels
    var $_text_x_start = 10; //the x-position on the image where letter drawing will begin

    //filename and/or directory configuration
    var $_audio_path = 'audio/'; //the full path to wav files used
    var $_gd_font_file = 'gdfonts/bubblebath.gdf'; //the gd font to use
    var $_ttf_file = 'elephant.ttf'; //the path to the ttf font file to load
    var $_wordlist_file = 'words/words.txt'; //the wordlist to use

    function startup( &$controller ) {

        //add local directory name to paths
        $this->_ttf_file = CAPTCHA_VENDOR_DIR.$this->_ttf_file;
		$this->_gd_font_file = CAPTCHA_VENDOR_DIR.$this->_gd_font_file;
    	$this->_audio_path = CAPTCHA_VENDOR_DIR.$this->_audio_path;
    	$this->_wordlist_file = CAPTCHA_VENDOR_DIR.$this->_wordlist_file;
		//CaptchaComponent instance of controller is replaced by a securimage instance
		$controller->captcha =& new securimage();
		$controller->captcha->arc_line_colors = $this->_arc_line_colors;
		$controller->captcha->audio_path = $this->_audio_path;
		$controller->captcha->charset = $this->_charset;
		$controller->captcha->code_length = $this->_code_length;
		$controller->captcha->draw_angled_lines = $this->_draw_angled_lines;
		$controller->captcha->draw_lines = $this->_draw_lines;
		$controller->captcha->draw_lines_over_text = $this->_draw_lines_over_text;
		$controller->captcha->font_size = $this->_font_size;
		$controller->captcha->gd_font_file = $this->_gd_font_file;
		$controller->captcha->gd_font_size = $this->_gd_font_size;
		$controller->captcha->image_bg_color = $this->_image_bg_color;
		$controller->captcha->image_height = $this->_image_height;
		$controller->captcha->image_width = $this->_image_width;
		$controller->captcha->line_color = $this->_line_color;
		$controller->captcha->line_distance = $this->_line_distance;
		$controller->captcha->line_thickness = $this->_line_thickness;
		$controller->captcha->multi_text_color = $this->_multi_text_color;
		$controller->captcha->text_angle_maximum = $this->_text_angle_maximum;
		$controller->captcha->text_angle_minimum = $this->_text_angle_minimum;
		$controller->captcha->text_color = $this->_text_color;
		$controller->captcha->text_maximum_distance = $this->_text_maximum_distance;
		$controller->captcha->text_minimum_distance = $this->_text_minimum_distance;
		$controller->captcha->text_transparency_percentage = $this->_text_transparency_percentage;
		$controller->captcha->text_x_start = $this->_text_x_start;
		$controller->captcha->ttf_file = $this->_ttf_file;
		$controller->captcha->use_gd_font = $this->_use_gd_font;
		$controller->captcha->use_multi_text = $this->_use_multi_text;
		$controller->captcha->use_transparent_text = $this->_use_transparent_text;
		$controller->captcha->use_word_list = $this->_use_word_list;
		$controller->captcha->wordlist_file = $this->_wordlist_file;
		$controller->set('captcha',$controller->captcha);
    }
}

?>

Usándolo en un controlador de ejemplo. Por ejemplo en un controlador de contacto.
Yo lo he usado en otros contraladores y con otros bucles de control, pero este os puede resultar útil como ejemplo inicial.

/app/controllers/contacts_controller.php

<?php 

class ContactsController extends AppController {
	
    var $name = 'Contacts';
    var $components = array('Captcha');
     
    function securimage($random_number){
        $this->autoLayout = false; //a blank layout

        //override variables set in the component - look in component for full list
        $this->captcha->image_height = 75;
        $this->captcha->image_width = 350;
        $this->captcha->image_bg_color = '#ffffff';
        $this->captcha->line_color = '#cccccc';
        $this->captcha->arc_line_colors = '#999999,#cccccc';
        $this->captcha->code_length = 5;
        $this->captcha->font_size = 45;
        $this->captcha->text_color = '#000000';

        $this->set('captcha_data', $this->captcha->show()); //dynamically creates an image
    }

    function index(){
        $this->set('captcha_form_url', $this->webroot.'contacts/index'); //url for the form
        $this->set('captcha_image_url', $this->webroot.'contacts/securimage/0'); //url for the captcha image

        $captcha_success_msg = 'The code you entered matched the captcha';
        $captcha_error_msg = 'The code you entered does not match';

        if( empty($this->data) ){ //form has not been submitted yet
            $this->set('error_captcha', ''); //error message displayed to user
            $this->set('success_captcha', ''); //success message displayed to user
            $this->render(); //reload page
        } else { //form was submitted 	
            if( $this->captcha->check($this->data['Contact']['captcha_code']) == false ) {
                //the code was incorrect - display an error message to user
                $this->set('error_captcha', $captcha_error_msg); //set error msg
                $this->set('success_captcha', ''); //set success msg
                $this->render(); //reload page
            } else {
                //the code was correct - display a success message to user
                $this->set('error_captcha', ''); //set error msg
                $this->set('success_captcha', $captcha_success_msg); //set success msg
                $this->render(); //reload page

                //after testing is complete, you would process the other form data here and save it
            }
        }
    }
}

?>

Crear la vista que renderiza la imagen que se crea dinamicamente
/app/views/contacts/securimage.ctp

<?php echo $captcha_data; ?>

Crear una vista que renderiza el formulario de contacto junto con el captcha de seguridad.
Este es el formulario de ejemplo que hay en la bakery.cakephp.org pero se puede mejorar mucho más. Pero os servirá para haceros una idea.

<form action="<?php echo $captcha_form_url; ?>" method="post">
<div>Verify :</div>
<div><img src="<?php echo $captcha_image_url; ?>" id="captcha" alt="CAPTCHA Image" /></div>
<div><input type="text" name="data[Contact][captcha_code]" size="10" maxlength="6" value="" /></div>
<div><a href="#" onclick="document.getElementById('captcha').src = '<?php echo $this->webroot;?>contact/securimage/' + Math.random(); return false">Reload Image</a></div>
<div style="color:red;"><?php echo $error_captcha; ?></div>
<div style="color:green;"><?php echo $success_captcha; ?></div>
<div><input type="submit" value="CLICK HERE TEST THE CAPTCHA" /></div>
</form>

Fuente: http://bakery.cakephp.org

Tags de búsquedas:

configurar securimage,cakephp captcha,captchas para formularios simples,como adicionar captcha a cakephp 3 0,descargar captcha para cakephp,seguridad con cakephp

Noticias relacionadas »

1 comentario en “Captcha de seguridad en cakePHP con Securimage

  1. Alfredo R
    / Responder

    Hola, deseo me ayudes con un sistema captcha para mi web, su subi al servidor incorporado al formulario, pero no se ejecuta correctamente,,,, el formulario es una secion de usuario que se conecta a la base de datos,,,,, que debo hacer….

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

10$ gratis con Digital Ocean »

Este blog está funcionando con Digital Ocean,
para todos los lectores 10$ gratis! para probar el cloud a través del siguiente enlace.


Ir a Digital Ocean

¡Comparte este artículo! »

Sígueme en Facebook »

  • Pedro Ventura (3 días)
    Hola Eli, Esos tags de búsquedas se incluyen automáticamente en…
  • reformas piso zaragoza (5 días)
    Fantastico post. Gracias por compartirlo...Espero màs... Saludos
  • Pedro Ventura (5 días)
    Hola Roy, Puedes consultar las comisiones en su página oficial:…
  • Roy (5 días)
    Supongo que la plataforma indica la comision que cobran. De…
  • eli (6 días)
    si los libros que recomiendas están en inglés, pq entre…
  • Curro (2 semanas)
    Gracias pive muy buen trabajo con este post, esta curradisimo,…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

profile for Pedro Ventura on Stack Exchange, a network of free, community-driven Q&A sites

Leer entrada anterior
Google Analytics: porcentaje de rebote y tiempo en el sitio 0

Desde que empece con el blog no me he metido en profundidad a analizar las métricas de Google Analytics, ni...

Cerrar