Quasi sicuramente avete sentito parlare di captcha e di codici di sicurezza, questi possono essere richiesti durante il commento di un articolo o durante la registrazione, altri li ho visti applicare anche al login.
Di fatto, si rendono - ahimè - necessari tutte le volte che subiamo degli attacchi da pc ... sisi avete capito bene si potrebbe quasi dire "Captcha e le macchine ribelli"!!
Allora solitamente questo è una immagine con delle lettere sopra, solitamente con scritta distorta, con un angolatura o degli elementi sopra per disturbarne l'acquisizione e la "lettura" da un pc.
Prima di tutto dobbiamo creare una classe, ad esempio captcha.php (evviva la fantasia) dove possiamo inserire il codice di creazione dlel'immagine:
<?php
while (@ob_end_clean());
ob_start();
session_start();
$secureimg['imagetype'] = "JPG"; // tipo di immagine, supporta JPG, PNG e GIF
$secureimg['image'] = "code_bg.jpg"; // nome del file immagine (compresa estensione)
$secureimg['size'] = "28"; // dimensione del font
$secureimg['length']= "5"; // numero caratteri del codice di sicurezza
$secureimg['angle'] = "4"; // angolo del testo
$secureimg['x'] = "15"; // punto X di partenza del testo
$secureimg['y'] = "40"; // punto Y di partenza del testo
$secureimg['width'] = "130"; // larghezza immagine (o porzione da considerare per scrivere il font)
$secureimg['height']= "45"; // altezza immagine (o porzione da considerare per scrivere il font)
$secureimg['font'] = "font.ttf"; // file font da usare
$secureimg['textcolor'] = "218,16,73"; // codice colore RGB del testo
$secureimg['linecolor'] = "128,128,73"; // codice colore RGB delle linee di disturbo
$secureimg['linecount'] = "0"; // numero di linee può valere 0, nel caso non ci sono linee di disturbo
if (!isset($secureimg['length']))
$secureimg['length'] = 5;
// creazione codice unico, vista la possibilità di avere un codice predicibile
// cerchiamo di complicare leggermente le cose
$length = intval($secureimg['length']);
$tmp = md5(uniqid(rand(), true));
$offset = rand(0, strlen($tmp) - $length);
$privcode = substr($tmp, $offset, $length);
if(isset($secureimg['imagetype']))
{
if ($secureimg['imagetype'] == 'JPG')
$image =imagecreatefromjpeg($secureimg['image']);
else if ($secureimg['imagetype'] == 'PNG')
$image =imagecreatefrompng($secureimg['image']);
else if ($secureimg['imagetype'] == 'GIF')
$image =imagecreatefromgif($secureimg['image']);
else
$image =imagecreatefromjpeg($secureimg['image']);
}
else
{
$secureimg['imagetype'] = 'JPG'; // serve per il content type
$image =imagecreatefromjpeg($secureimg['image']); // cerca immagine formato jpg se formato non è specificato
}
if(isset($secureimg['textcolor']))
{
$tmp = explode(",",$secureimg['textcolor']);
$textcolor = imagecolorallocate($image,$tmp[0],$tmp[1],$tmp[2]);
}
else
{
$textcolor = imagecolorallocate($image, 218, 16, 73);
}
if(isset($secureimg['linecolor']))
{
$tmp = explode(",",$secureimg['linecolor']);
$linecolor = imagecolorallocate($image,$tmp[0],$tmp[1],$tmp[2]); //line color 233,239,239
for ($i = 1; $i <= $secureimg['linecount']; $i++) {
imageline($image,rand(0,$secureimg['width']),rand(0,$secureimg['height']),rand(0,$secureimg['width']),rand(0,$secureimg['height']),$linecolor);
}
}
if(isset($secureimg['font']) && is_readable($secureimg['font']))
{
imagettftext($image, $secureimg['size'],$secureimg['angle'], $secureimg['x'], $secureimg['y'], $textcolor, $secureimg['font'], $privcode);
}
else
{
imagestring($image, $secureimg['size'], $secureimg['x'], $secureimg['y'], $privcode, $textcolor);
}
// il codice deve essere disponibile nella sessione (al sicuro) per eventuali controlli
$_SESSION['key'] = $privcode;
// preparazione content type per invio
header("Content-type: image/".strtolower($secureimg['imagetype']));
// invio l'immagine al browser
if ($secureimg['imagetype'] == 'JPG')
imagejpeg($image);
else if ($secureimg['imagetype'] == 'PNG')
imagepng($image);
else if ($secureimg['imagetype'] == 'GIF')
imagegif($image);
else
imagejpeg($image);
//ok, non serve più
imagedestroy($image);
//ob_end_clean();
?>
Bene nel codice trovate tutti i commenti, per essere utilizzato al meglio è sufficiente impostare come si vuole generare il codice, questo va fatto una volta sola e precisamnetenelle prime file del codice php precedente trovate le seguenti righe:
$secureimg['imagetype'] = "JPG"; // tipo di immagine, supporta JPG, PNG e GIF
$secureimg['image'] = "code_bg.jpg"; // nome del file immagine (compresa estensione)
$secureimg['size'] = "28"; // dimensione del font
$secureimg['length']= "5"; // numero caratteri del codice di sicurezza
$secureimg['angle'] = "4"; // angolo del testo
$secureimg['x'] = "15"; // punto X di partenza del testo
$secureimg['y'] = "40"; // punto Y di partenza del testo
$secureimg['width'] = "130"; // larghezza immagine (o porzione da considerare per scrivere il font)
$secureimg['height']= "45"; // altezza immagine (o porzione da considerare per scrivere il font)
$secureimg['font'] = "font.ttf"; // file font da usare
$secureimg['textcolor'] = "218,16,73"; // codice colore RGB del testo
$secureimg['linecolor'] = "128,128,73"; // codice colore RGB delle linee di disturbo
$secureimg['linecount'] = "0"; // numero di linee può valere 0, nel caso non ci sono linee di disturbo
I commenti sono stati inseriti su ogni riga, ora non resta che decire l'immagine che io ho chiamato code_bg.jpg ovviamente modificabile e il font da usare, per la scelta di quest'ultimo io mi sono affidato all'ormai celebre e affidabile dafont.com, in questo sito potete trovare davvero tantissimi font.
Fate attenzione solo a un paio di cosette, primo il font deve essere di tipo TTF (ossia True Type Font) e secondo che non sia coperto da una licenza, giusto per evitarvi delle grane. Per la scelta poi consiglio dei font non troppo lineari o standard.
Ok, ora passiamo all'applicazione. Come usare lo script? In modo molto semplice quello che segue è un piccolo esempio di come verificare il codice captcha generato:
<?php
session_start();
echo '<html><body>';
if (isset($_SESSION['key']) && !empty($_SESSION['key'])
&& isset($_POST['code']) && !empty($_POST['code']))
{
if (strcmp($_SESSION['key'], $_POST['code']) == 0)
{
echo '<br/>Ok, umani alla riscossa!<br/><br/>';
}
else
{
echo '<br/>Mi spiace, non conosco nessun Connor :P<br/><br/>';
}
}
?>
<br/><br/>
<img style='margin-left:50px;margin-bottom:10px;' src="php_captcha.php">
<form action="prova.php" method="post">
Codice <input id='code' style='width:120px;' name='code' />
<input type="submit" value="Invia" />
</form>
</body>
</html>
Nell'esempio si vede che il form risulta essere davvero banale, cos' come il codice php di controllo. Attenzione, non salvate il codice reale in altri posti come variabili etc meglio evitare di portarsi in giro questa preziosa chiave.
Bene questo è tutto, ora abbiamo un semplice file captcha che possiamo usare o integrare facilmente dove vogliamo.