"Gli Jatravartid di Viltvodle VI credono invece che il cosmo sia nato dallo starnuto di un essere chiamato il Grande Ciaparche Verde."

Towel Day - Non fatevi prendere dal Panico

Guida Galattica per gli Autostoppisti

Creare Form con validazione e CAPTCHA in Joomla 3 - terza parte

Logo Joomla
Immagine da Joomla
In questa terza parte della serie di articoli dedicati alla creazione di un form con validazione campi e reCAPTCHA andremo ad implementare proprio quest'ultima caratteristica.
Cos'è reCAPTCHA? Dalla definizione di Google:
reCAPTCHA is a free service that protects your website from spam and abuse. reCAPTCHA uses an advanced risk analysis engine and adaptive CAPTCHAs to keep automated software from engaging in abusive activities on your site. It does this while letting your valid users pass through with ease.
In termini comprensibili: reCAPTCHA è quella noiosissima, ma purtroppo necessaria, procedura che vi obbliga a individuare auto, cartelli stradali, negozi od altro tra una serie di immagini quando dovete confermare la trasmissione di dati in rete. Nelle sue prime incarnazioni era anche più seccante: dovevate riconoscere una serie di caratteri alfanumerici da inserire in una casella di testo. A proposito: reCAPTCHA è l'acronimo di Completely Automated Public Turing test to tell Computers and Humans Apart; serve insomma per garantire che chi sta interagendo con il servizio web sia un essere umano, non un bot. Perchè si usa? Leggete la definizione di Google sopra.
Basta con le note bibliografiche, troverete dettagli su caratteristiche ed aspetti tecnici di reCAPTCHA ovunque in rete, il riferimento principale è il sito di Google. Qui mi limito ad implementare tale funzione, per ora ci basti sapere che è necessario registrare il dominio da validare e disporre di chiavi di cifratura pubblica e privata.
In breve, la procedura è la seguente:
  • Collegarsi alla pagina reCAPTCHA di google per registrare il dominio sul quale attivare la validazione; dovete disporre di un account Google, in caso contrario se ne deve creare uno.
  • Assegnare un nome per il sito nel campo Etichetta e selezionare il tipo di reCAPATCHA; nel nostro caso, reCAPTCHA V2. Quindi indicare il dominio e spuntare la casella dei termini di servizio, come da figura:
  • Fare clic su Registrazione per completare la procedura. Nella pagina successiva sono elencate le chiavi necessarie per utilizzare reCAPTCHA, quella pubblica (Chiave del sito) e quella privata (Chiave segreta)
Bene. Ora il nostro dominio è registrato su Google, abbiamo le chiavi di cifratura, dobbiamo solo leggere con attenzione il resto della pagina su cui siamo giunti dopo la procedura, in particolare le sezioni Passaggio 1: integrazione lato client e Passaggio 2: integrazione lato server. Lato client: si deve inserire nel codice HTML il caricamento dello script api.js, codice:
<script src='https://www.google.com/recaptcha/api.js?hl=it'></script>
Nota: il parametro hl=it specifica di utilizzare la lingua italiana.
Si deve poi inserire. prima della chiusura del tag form, il codice che provvede a mostrare il classico campo con il testo Non sono un robot, con cui deve interagire l'utente. Codice:
<div class="g-recaptcha" data-sitekey="copiaquilatuachiavepubblica"></div>
Nota: il parametro data-sitekey contiene la vostra chiave pubblica.
Fin qui, tutto molto semplice. Passiamo alla parte lato server. "Lato server" significa che, dopo avere trasmesso i dati, i server di Google verificano se sono validi e rispondono validando o meno la richiesta. Questo è un po' più oscuro... Significa che dovremo scrivere un po' di codice PHP, eseguito ovviamente lato server, per controllare i dati passati e rispondere al client se sono corretti.
La faccio brevissima: ecco il codice PHP, diretto e brutale:
<?php  
	require_once('autoload.php'); 
	$secret = "copiaquilatuachiaveprivata";
	$lang='it';
	$result=false;	
	$recaptcha = new \ReCaptcha\ReCaptcha($secret);
	
	$response = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);

	if ($response->isSuccess()) {
		$result=true;
	} 
	else {
		foreach ($response->getErrorCodes() as $code) {
			echo '<tt>Errore: ' , $code , '</tt> ';
		}
		
		$result=false;
	}

	echo json_encode($result);
?>
Premessa: non è farina del mio sacco, ho preso spunto dal repository google su Github. Inoltre, l'esempio in questione è estremamente semplificato, non ci sono controlli ad esempio sui valori passati via POST, non controllo nemmeno se sono presenti... Quindi, questo è qualcosa che potete fare voi, consultate con attenzione l' esempio google.
Qualche spiegazione, poi alcune note pratiche di utilizzo.
  • Riga iniziale:
    require_once('autoload.php');
    Roba di google. Lo scaricate sempre dal repository ufficiale, quindi lo caricherete sul sito nella stessa cartella dove andremo a caricare il codice PHP.
  • Successive:
    $secret = "copiaquilatuachiaveprivata";
    $lang='it';		
    $result=false;	
    $recaptcha = new \ReCaptcha\ReCaptcha($secret);
    Sono variabili: $secret deve contenere la vostra chiave privata, le altre sono inizializzazioni. Pigliatele così, senza chiedere ...
  • Tutto il resto:
    $response = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
    if ($response->isSuccess()) {
    	$result=true;
    } 
    else {
    	foreach ($response->getErrorCodes() as $code) {
    		echo '<tt>Errore: ' , $code , '</tt> ';
    	}
    	
    	$result=false;
    }
    
    echo json_encode($result);
    Qui controlliamo se la verifica è andata a buon fine (..isSuccess()...); se sì $result è true, altrimenti false, con stampa dei codici di errore. Rimane poi questa "strana" riga json_encode e compagnia bella. Brevemente, ritorna la rappresentazione json di quello che le viene passato (v. la documentazione relativa su php.net).
Inutile dilungarsi oltre, sui link github trovate tutte le spiegazioni del caso. Poi, mica mi pagano per scrivere tutta questa roba... Vediamo piuttosto come renderla disponibile sul sito:
  • Scarichiamo localmente dalla pagina del repository sia la cartella ReCaptcha che il file autoload.php;
  • Carichiamo cartella e file sul sito, magari copiandoli in una cartella dedicata, che potremmo chiamare "captcha";
  • Salviamo il sorgente precedente con un nome (p.e. "submit-captcha.php") e carichiamolo sul sito nella medesima cartella "captcha";
Ora prepariamo un breve form che contiene solo il nostro reCAPTCHA:
<form action="captcha/submit-captcha.php" method="post">	
	<div class="g-recaptcha" data-sitekey="6LcbzCEUAAAAAEl2nyx_h0kYgy6gOv4JYxnNarYI"></div>
	<button class="uk-button uk-button-primary uk-button-small uk-margin-top" type="submit" value="Invia">Invia</button>
</form>	
Tutto qui. Come? Ho esposto la mia chiave pubblica? Beh al di là del fatto che per vederla basta consultare il sorgente HTML della pagina, vi ricordo che in questo caso la parola pubblica non è casuale... Ed ecco infine il nostro semplice form in azione:
Provate a fare clic su Invia sia dopo avere fatto clic sulla casella Non sono un robot che senza barrarla. Ohibò, il comportamento è inaspettato: nel primo caso, dopo che avrete risolto il test, si apre una misteriosa finestra bianca che contiene solo il testo true, nel secondo c'è un altrettanto misteriosa finestra con il testo Errore: missing-input-response false. Se ci ragioniamo un attimo, però, si comprende che nel primo caso il nostro sorgente submit-captcha.php ha semplicemente restituito il valore per verifica soddisfatta, nel secondo ha presentato l'errore stampato dalla riga echo '<tt>Errore: ' , $code , '</tt> '; per poi restituire false.
Questo significa che il nostro sistema funziona come dovrebbe, ma certo il risultato è presentato in modo assolutamente incomprensibile, direi anzi inutile per l'utente, visto che non gli spiega in alcun modo cosa è andato storto. La ragione è che manca ancora un passo per concludere il nostro sistema: l'integrazione con il controllo di validazione che abbiamo preparato tramite jQuery Validation Plugin nella seconda parte della serie di articoli dedicati a questo argomento.
L'utente scafato potrebbe obiettare che si sarebbe potuto fare un form che ricarica questa stessa pagina, controlla i dati POST del caso e, se corretti, mostra un messaggio di successo od errore. Molto più elegante e comprensibile, certo. Ma ci sono due buone ragioni se non l'ho fatto:
  1. Un procedimento del genere prevede l'uso di codice PHP, cosa che richiede l'installazione di un plugin; come ho detto nella prima parte della serie di articoli, voglio creare questo form senza ricorrere a software di terzi;
  2. Secondo, l'integrazione con jQuery Validation Plugin è molto più efficiente, evitando di inviare il form se l'utente ha lasciato vuota la casella Non sono un robot, dando un risultato più elegante e rimanendo coerente con la gestione degli altri campi che vengono validati.
L'integrazione della validazione con il reCAPTCHA concluderà questa serie di articoli dedicata all'argomento.

Tags: Joomla, Personalizzare template, Twitter Bootstrap, jQuery

Contattami, ma pensaci bene

  • Scrivimi, affinchè possa ignorarti con calma
  • Pubblico questa roba dalla Bassa Modenese. Sì, la zona del terremoto di maggio 2012...

    ... tromba d'aria nel 2013...

    ... alluvione nel 2014...

    ... nuova tromba d'aria nel 2014

Cominciamo ad essere un po' scocciati

E questo Ciaparche, cos'è?

Se ti punge vaghezza di conoscere la risposta e dimostrare così la tua ignoranza, non temere: nessuno dal monitor ti osserva (sicuro? Meglio essere attenti... controlla le impostazioni di privacy della fotocamera), per cui corri ad informarti facendo clic sul link sotto.

Se sei tra quegli eletti che hanno colto la citazione, hai tutta la mia approvazione.

Soddisfa la tua curiosità

Riassunto per pigri

Se i titoli dei menu non ti sono chiari, al tuo posto mi preoccuperei. Vabbè oggi mi sento magnanimo e ammetto che alcuni sono criptici o ambigui, per cui ho deciso di metterti a disposizione un riassunto che ti spiega in breve cosa troverai in questo sito.

Dissipa i tuoi dubbi