PHP: Creare un modulo con il captcha

Forum per tutti i neofiti e gli esperti che vogliono proporre o rispondere ad argomenti che riguardano lo sviluppo di apllicazioni web basate in aprticolare su Html - Css - Php - MySql, ma non solo...

Moderatore: Michele

PHP: Creare un modulo con il captcha

Messaggioda Michele » lun nov 12, 2007 11:02 pm

Salve! l'articolo è preso da:
http://www.webmasterpoint.org/php/tutor ... ha-php.asp

L' ho trovato didatticamente molto utile! :P

Lo riporto di seguito:
Attualmente una delle strategie più diffuse adottate da webmasters per combattere il fenomeno spam è l' adozione dei captcha. Questo sistema richiede all' utente l' inserimento in un campo di testo di alcuni caratteri alfanumerici presenti all' interno di un' immagine. Se l' utente lo riporta correttamente, può procedere nell' azione, altrimenti viene bloccato. Ciò fa in modo che solamente gli utenti "umani" possano effettuare determinate operazioni, essendo gli unici a poter leggere qualcosa contenuto in un' immagine.

Vediamo in questo tutorial come creare un sistema di captcha in PHP 5.

Innanzitutto, analizziamo la classe PHP necessaria alla creazione di un' immagine contenente caratteri alfanumerici casuali:

Codice: Seleziona tutto
  // definisce la classe 'ImageGenerator'

    class ImageGenerator{

      private $width=400;

      private $height=300;

      private $bgColor='0,0,0';

      private $textColor='255,255,255';

      private $inputString='Default Input String';

      private $bgImage=NULL;

      private $img;

    // innizializza gli argomenti inseriti

    public function __construct($inputString='Default Input String'){

      if(strlen($inputString>255)){

       throw new Exception('Lunghezza stringa inserita non valida.');

    }

      $this->inputString=$inputString;

    }

      public function setImageWidth($width=400){

       if(!is_int($width)&&$width>800){

        throw new Exception("Larghezza immagine non valida');

    }

      $this->width=$width;

    }

      public function setImageHeight($height=300){

       if(!is_int($width)&&$height>600){

        throw new Exception('Altezza immagine non valida.');

    }

    }

      public function setImageBgColor($bgColor='0,0,0'){

       if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$bgColor)){

        throw new Exception('Colore di sfondo non valido.');

    }

      $this->bgColor=$bgColor;

    }

      public function setImageTextColor($textColor='255,255,255'){

       if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$textColor)){

        throw new Exception("Colore del testo non valido.');

    }

      $this->textColor=$textColor;

    }

      public function setBgImage($bgImage='default.gif'){

       if(!file_exists($bgImage)){

        throw new Exception('Immagine di sfondo non valida');

    }

      $this->bgImage=$bgImage;

    }

      public function setImageFont($font){

       if(!file_exists($font)){

        throw new Exception('Font non valido.');

    }

      $this->font=$font;

    }

    // Crea il flusso dell' immagine

      public function displayImageStream(){

    $this->img=$this->bgImage!=NULL?imagecreatefromgif($this-
    >bgImage):imagecreate($this->width,$this->height);

      $bgColor=explode(',',$this->bgColor);

      $textColor=explode(',',$this->textColor);

    // inserisce il colore di background dell' immagine nel suo flusso

    imagecolorallocate($this->img,$bgColor[0],$bgColor[1],$bgColor
    [2]);

    // inserisce il colore del testo dell' immagine nel suo flusso

    $textColor=imagecolorallocate($this->img,$textColor[0],$textColor
    [1],$textColor[2]);

    // carica i font

    if(!imagestring($this->img,5,$this->width/2-strlen($this-
    >inputString)*5,$this->height/2-5,$this->inputString,$textColor)){

      throw new Exception('Errore nella creazione del testo');

    }

      header("Content-type: image/gif");

    // mostra l' immagine

      imagegif($this->img);

    // libera la memoria utilizzata

      imagedestroy($this->img);

     }

    }


Come possiamo notare, è tutto piuttosto semplice ed intuitivo: la classe richiede alcuni parametri come il colore di sfondo dell' immagine e quello del testo da inserirvi, che vengono inizializzati tramite i metodi buildImageStream() e displayImage(). Supporta anche la possibilità di impostare come sfondo un' immagine, che viene inserita tramite il metodo setBgImage().

A questo punto abbiamo la classe per creare un' immagine random, ma ci serve quella per creare la sequenza alfanumerica casuale. Tale classe la chiameremo RandomGenerator, e sarà la seguente:

Codice: Seleziona tutto
   class RandomGenerator{

      private $length;

      private $chars="ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";

      public function __construct($length=4){

       if(!is_int($length)||$length<1){

        throw new Exception('Lunghezza stringa non valida');

    }

      $this->length=$length;

    }

      public function getRandomValue(){

       $rndstr='';

        $maxvalue=strlen($this->chars)-1;

       for($i=0;$i<$this->length;$i++){

        $rndstr.=substr($this->chars,rand(0,$maxvalue),1);

    }

      return $rndstr;

     }

    }



Tal classe non farà altro che restituire nella variabile $rndstr una sequenza di caratteri casuale di lunghezza prefissata.

Dobbiamo ora coadiuvare le due classi, farle interagire tra loro. Ecco come:

Codice: Seleziona tutto
   // definisce la classe 'ImageGenerator'

    class ImageGenerator{

      private $width=400;

      private $height=300;

      private $bgColor='0,0,0';

      private $textColor='255,255,255';

      private $inputString='Default Input String';

      private $bgImage=NULL;

      private $img;

    // inizializza gli argomenti di input

    public function __construct($inputString='Default Input String'){

      if(strlen($inputString>255)){

       throw new Exception('Lunghezza stringa inserita non valida');

    }

      $this->inputString=$inputString;

    }

      public function setImageWidth($width=400){

       if(!is_int($width)&&$width>800){

        throw new Exception('ILargezza immagine non valida');

    }

      $this->width=$width;

    }

      public function setImageHeight($height=300){

       if(!is_int($width)&&$height>600){

        throw new Exception('Altezza immagine non valida');

     }

    }

      public function setImageBgColor($bgColor='0,0,0'){

       if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$bgColor)){

        throw new Exception('Colore sfondo non valido.');

    }

      $this->bgColor=$bgColor;

    }

      public function setImageTextColor($textColor='255,255,255'){

       if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$textColor)){

        throw new Exception('Colore testo non valido.');

    }

      $this->textColor=$textColor;

    }

      public function setBgImage($bgImage='default.gif'){

       if(!file_exists($bgImage)){

        throw new Exception('Immagine di sfondo non valida');

    }

      $this->bgImage=$bgImage;

    }

      public function setImageFont($font){

       if(!file_exists($font)){

        throw new Exception('Font non valido.');

    }

      $this->font=$font;

    }

    // crea il flusso dell' immagine

      public function displayImageStream(){

    $this->img=$this->bgImage!=NULL?imagecreatefromgif($this-
    >bgImage):imagecreate($this->width,$this->height);

      $bgColor=explode(',',$this->bgColor);

      $textColor=explode(',',$this->textColor);

    // inserisce il colore di background dell' immagine nel suo flusso

    imagecolorallocate($this->img,$bgColor[0],$bgColor[1],$bgColor
    [2]);

    // inserisce il colore del testo dell' immagine nel suo flusso

    $textColor=imagecolorallocate($this->img,$textColor[0],$textColor
    [1],$textColor[2]);

    // carica font

    if(!imagestring($this->img,5,$this->width/2-strlen($this-
    >inputString)*5,$this->height/2-5,$this->inputString,$textColor)){

      throw new Exception('Errore nella creazione del testo);

    }

      header("Content-type: image/gif");

    // mostra l' immagine

      imagegif($this->img);

    // libera la memoria usata

      imagedestroy($this->img);

     }

    }

    class RandomGenerator{

      private $length;

      private $chars="ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";

      public function __construct($length=4){

       if(!is_int($length)||$length<1){

        throw new Exception('Lunghezza stringa casuale non valida.');

    }

      $this->length=$length;

    }

      public function getRandomValue(){

       $rndstr='';

        $maxvalue=strlen($this->chars)-1;

       for($i=0;$i<$this->length;$i++){

        $rndstr.=substr($this->chars,rand(0,$maxvalue),1);

    }

      return $rndstr;

     }

    }



Vediamo infine come richiamare in maniera intelligente le due classi, dando vita al captcha in una determinata zona della pagina:

Codice: Seleziona tutto
  try{

    // Crea una nuova istanza della classe 'RandomGenerator'

      $rnd=new RandomGenerator();

    // Crea una nuova istanza della classe 'ImageGenerator'

      $imgGen=new ImageGenerator($rnd->getRandomValue());

    // mostra l' immagine

      $imgGen->displayImageStream();

    }

      catch(Exception $e){

       echo $e->getMessage();

      exit();

    }



:idea:
Michele
 
Messaggi: 308
Iscritto il: ven mar 17, 2006 2:14 am

Torna a Webmaster

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron