mercoledì 8 settembre 2010

Una comoda classe php captcha

Oggi presento una comoda classe php captcha, proveniente da OpenCart . Essendo il progetto open source, possiamo analizzare come funziona ma soprattutto come usarla con tre righe di codice.
Prima di tutto vediamo il contenuto della classe:
<?php

class Captcha {



/**
* Classe captcha.php - da www.opencart.com
*/

protected $code;
protected $width = 35;
protected $height = 150;

function __construct() {
$this->code = substr(sha1(mt_rand()), 17, 6);
}
function getCode(){
return $this->code;
}
function showImage() {
$image = imagecreatetruecolor($this->height, $this->width);
$width = imagesx($image);
$height = imagesy($image);
$black = imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocatealpha($image, 255, 0, 0, 75);
$green = imagecolorallocatealpha($image, 0, 255, 0, 75);
$blue = imagecolorallocatealpha($image, 0, 0, 255, 75);
imagefilledrectangle($image, 0, 0, $width, $height, $white);
imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $red);
imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $green);
imagefilledellipse($image, ceil(rand(5, 145)), ceil(rand(0, 35)), 30, 30, $blue);
imagefilledrectangle($image, 0, 0, $width, 0, $black);
imagefilledrectangle($image, $width - 1, 0, $width - 1, $height - 1, $black);
imagefilledrectangle($image, 0, 0, 0, $height - 1, $black);
imagefilledrectangle($image, 0, $height - 1, $width, $height - 1, $black);
imagestring($image, 10, intval(($width - (strlen($this->code) * 9)) / 2), intval(($height - 15) / 2), $this->code, $black);

header('Content-type: image/jpeg');
imagejpeg($image);
imagedestroy($image);

}

}

?>
Utilizzare questa classe è alquanto semplice: poniamo infatti di dover usare una pagina php per la registrazione dell'utente chiamata register.php. Questa pagina avrà un form che invierà i dati alla pagina stessa, dopo il submit dell'utente.

Abbiamo bisogno di una ulteriore pagina, chiamata immagineCaptcha.php.
Tra i campi che andremo a controllare, ci sarà anche il codice captcha, salvato in una variabile di sessione. Per spiegarmi meglio, immagineCaptcha.php sarà così composto:
<?php

session_start();
include("captcha.php");
$c = new Captcha();

// Si salva il getCode in sessione
$_SESSION['code'] = $c->getCode();

$c->showImage();
?>

Nella pagina register.php, ci sarà sia il form che il controllo del form stesso:
<?php

session_start();

if(isset($_POST['email'])) {
//Form inviato
if($_SESSION['code']==$_POST['code']) {
//controllo captcha andato a buon fine
//qui funzione di registrazione
}
}
else {
//Mostro il form
?>

<form method="post" action="register.php">
<input type="text" name="email"/>
<input type="text" name="code"/>
<img src="immagineCaptcha.php"/>
<input type="submit"/>
</form>

<?php }

?>