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!

Trackback

Dai il tuo parere: Commenta questo articolo!
0 commenti su [PHP] Captcha testuale semplice semplice
    Lascia un commento


    Webmaster .::DnaX::. RSS
    CC 2004-2008 di DnaX Web Site. Per informazioni sulla licenza leggere le Note legali

    Lo script ha impiegato: 0.17258s ed eseguito 40 query SQL.

    Torna su