Creare un CAPTCHA – PHP

captchaCAPTCHA

Ma che cosa è un captcha? A cosa serve?

Il CAPTCHA(Completely Automated Public Turing test to tell computers and Humans Apart) è un test fatto di una o più domande fatto di una o più domande e risposte per determinare se l'utente sia un umano (e non un computer o, più precisamente, un bot).

I CAPTCHA sono utilizzati per impedire che i bot utilizzino determinati servizi, come i forum, la registrazione presso siti web, la scrittura di commenti e in generale tutto ciò che potrebbe essere usato per creare spam o per violare la sicurezza con operazioni di hacking come il brute force. Questo tipo di test è stato utilizzato anche per contrastare lo spam generato da bot, obbligando il mittente di un messaggio e-mail non conosciuto dal destinatario a superare un test CAPTCHA prima di consentire la consegna del messaggio.

Un test CAPTCHA tipicamente utilizzato è quello in cui si richiede all'utente di scrivere quali siano le lettere o i numeri presenti in una sequenza, che appare distorta o offuscata sullo schermo.

Implementazione

Questa è la mia classe che sviluppera un'immagine con all'interno il codice del captcha.

CaptchaImage.php

<?php
	class CaptchaImage{
		public $path = "img.jpg";
		public $codice;
		
		/** 
		* Costruttore della classe
		* @param string $path Percorso dell'immagine
		*/
		public function CaptchaImage($path="img.jpg"){
			$this->path = $path;
			
		}
		
		/** 
		* Crea una immagine con un codice casuale nel percorso $path 
		* @return string Percorso dell'immagine
		*/
		public function creaImg(){
			// Creo il codice
			$this->codice = array(rand(0,9), rand(0,9), rand(0,9), rand(0,9));
			$len = strlen(implode($this->codice));
			
			// Dimesioni
			$altezza = 50;
			$larghezza = 40 * $len;
			// Creo l'immagine
			$img = ImageCreate($larghezza,$altezza);
			// Sfondo
			$grigio = ImageColorAllocate($img,200,200,200);
			// Colori
			$nero = ImageColorAllocate($img,0,0,0);
			
			// linee
			imagesetthickness($img, 3);
			for($i = 0; $i < rand(4, 10); $i++){
				$colore = ImageColorAllocate($img,rand(100,200),rand(100,200),rand(100,200));
				ImageLine($img, rand(0,$larghezza),rand(0,$altezza), rand(0,$larghezza),rand(0,$altezza), $colore);
			}
			// Scrivo il testo
			// nella variabile $font bisogna inserire il percorso del font scelto
			$font = "arial.ttf";
			for($i = 0; $i < $len; $i++){
				imagettftext($img, 40, rand(-20,20), 30*($i+1), 45, $nero, $font, strval($this->codice[$i]));
			}
			// Creo l'immagine nel percorso specificato
			ImageJPEG($img, $this->path);
			return $this->path;
		}
		
		/** 
		* Restituisce il codice creato all'interno dell'immagine
		* @return string Codice di controllo
		*/
		public function getCodice(){
			return implode($this->codice);
		}
	
	}
?>

Esempio

<?php
	require("CaptchaImage.php");
	$captcha = new CaptchaImage();
?>
<!DOCTYPE html>
<html>
<head>
	<title>CAPTCHA</title>
</head>
<body>
	<img src="<?php echo $captcha->creaImg();?>" >
	<p>Codice = <?php echo $captcha->getCodice();?></p>
</body>
</html>

captcha

Precedente GPass - Gestione password - C#