Blog

[PHP] Captcha testuale semplice semplice

I captcha sono quelle immagini con all'interno numeri e lettere, spesso deformate che dovete riscrivere in una casella di testo. Questi sistemi servono per bloccare lo spam e in generale chiunque usi sistemi automatici per registrare falsi utenti o inviare commenti. Il funzionamento è semplice ma efficace, mentre il nostro cervello riesce facilmente (non sempre...) a capire delle lettere anche se molto deformate, per un computer è praticamente impossibile. L'unico problema di questi captcha grafici è che talvolta tagliano completamente fuori le persone con problemi visivi e che usano lettori in grado di leggere le pagine web. Ovviamente una immagine non può essere letta da un pc!

Una variazione al tema dei captcha grafici è quello di porre una facile domanda all'utente come ad esempio chiedere di eseguire una somma.

L'implementazione che ho scelto per l'estrema facilità è quella di usare le sessioni con PHP per portarmi dietro i risultati alle somme proposte.

Innanzitutto avviamo una nuova sessione. Se questa è già presente avremo a portata di mano i dati della sessione in corso

session_start();


Iniziamo col generare due numeri casuali da 1 a 9

$num1 = rand(1,9);

$num2 = rand(1,9);


Sommiamoli e memorizziamoli nella sessione corrente

$_SESSION['code'] = $num1 + $num2;


Adesso stampiamo il form con la domanda

<form action=\"captcha.php\" method=\"POST\">

<?

echo "
<label for=\"code\">Quanto fa <span id=\"num1\"></span> + <span id=\"num2\"></span>? </label>";

?>

<input name="code" type="text">

<input type="submit" name="submit">

</form>


Quindi per controllare che l'utente abbia dato la giusta risposta faremo un semplice controllo

if( isset( $_POST['submit'] ) )

{

    if( $_POST['code'] == $_SESSION['code'] )

        echo "<b>Accettato</b>";

    else

        echo "<b>Codice sbagliato</b>";

}


Praticamente controlliamo che l'utente abbia fatto click sul pulsante di invio dati, successivamente, in caso affermativo, controlliamo che la giusta somma da noi calcolata precedentemente sia uguale a quella data dall'utente.

Direte voi, come mai resta memorizzata all'interno della variabile globale $_SESSION anche dopo il ricaricamento? Semplicemente perché le sessioni possono mantenere dati lungo tutta la navigazione della pagina fino a che non si riavvia il browser.

Ecco il codice completo:

session_start();



if( isset( $_POST['submit'] ) )

{

        if( $_POST['code'] == $_SESSION['code'] )

                echo "<b>Accepted</b>";

        else

                echo "<b>Wrong code</b>";

}



$num1 = rand(1,9);

$num2 = rand(1,9);



$_SESSION['code'] = $num1 + $num2;



echo "<form action=\"captcha.php\" method=\"POST\">";

echo "<label for=\"code\">Quanto fa $num1 + $num2? </label>";

echo "<input name=\"code\" type=\"text\">";

echo "<input type=\"submit\" name=\"submit\"></form>";

 


Se vi interessa c'è un trucchetto per precompilare il form da javascript in modo da non renderlo visibile agli spam-bot (per ora!).

Basta incapsulare i due numeri i due , un piccola routine javascript leggerà tali , sommerà il loro contenuto e lo stamperà nel campo di testo.

echo "<form action=\"captcha.php\" method=\"POST\">";

echo "<label for=\"code\">Quanto fa <span id=\"num1\">$num1</span> + <span id=\"num2\">$num2</span>? </label>";

echo "<input name=\"code\" type=\"text\">";

echo "<script language=\"JavaScript\" type=\"text/javascript\">

document.form.code.value=eval((document.getElementById('num1')).innerHTML)+eval((document.getElementById('num2')).innerHTML);

 </script>"
;

echo "<input type=\"submit\" name=\"submit\">

</form>"
;



Alla prossima!

DIASPORA* Facebook

Pubblicato il 18 agosto 2008 da e letto 3268 volte.

Link di trackback

Abbonati al feed RSS. Se non sai cos'è guarda qui.

Abbonati alla newsletter per ricevere via email ogni nuovo articolo pubblicato. L'indirizzo verrà gestito da FeedBurner.

Dai il tuo parere: Commenta questo articolo!
1 commenti su [PHP] Captcha testuale semplice semplice
  1. Alcatraz dice:

    Grazie

    Ciao

    sabato, 10 marzo 2012 alle 1:48
Lascia un commento

CC BY-NC-SA 3.0 2004-2012 Daniele Napolitano — Per informazioni sulla licenza leggere le Note legali
Torna su