Scrivere a mano un controllo antispam con PHP

Come sviluppare in PHP un potente antispam personalizzato da inserire in un modulo di una pagina web

spambot infographic

Per limitare lo spam sulla casella di posta elettronica, dovuto alla presenza della nostra mail in chiaro sul sito, abbiamo avuto la splendida idea di inserire un modulo di contatto in PHP sperando di limitarlo. Il risultato? Lo abbiamo solo peggiorato.

Gli spambot sono ovunque, scandagliano la rete non solo alla ricerca di indirizzi di posta elettronica, ma anche di moduli di contatto, e una volta rintracciati questi vengono praticamente bombardati di spam.

Le soluzioni sono tante, dalla risoluzione di un captcha, alla selezione di immagini, ma ho preferito adottare la pratica del fai da te, usando PHP.

L’idea

Ho sviluppato con pochissime righe un controllo antispam efficiente, leggero, e che non prevede l’importazione di nessuna libreria di terze parti.

L’idea è molto semplice.

Inserire all’interno del form dei radio button da valorizzare rispettando un numero casuale generato dalla pagina stessa. La domanda dovrà poi essere codificata, e anche i valori di risposta dei radio button.

Lo schematizzo in una tabella prima di spiegarlo in maniera più comprensibile.

Numero generatoDomanda associataRisposta associata

 

visibile nel radio button

Valore del

 

radio button

1Seleziona uno1mamma
2Seleziona due2papa
3Seleziona tre3sorella
4Seleziona quattro4fratello
5Seleziona cinque5cugino
  • La pagina, all’apertura, genererà un numero da 1 a 5. Prendiamo come esempio il 3.
  • Al numero 3 verrà posta come domanda Seleziona tre.
  • La risposta associata nel radio button è il 3
  • Il valore, in html, del radio button è sorella.

Quando daremo l’Invia una procedura convertirà il valore sorella nel 3. Lo confronterà con il valore generato, e dopo aver capito che il valore coincide, il form viene compilato.

modulo contatti selectallfromdual

Il codice

Il codice è molto semplice, lo scriverò rispettando la tabella della codifica scritta in alto.

Per prima cosa andremo a generare un numero randomico da 1 a 5. Questo è solo un esempio, poi potremo espandere il range per il numero casuale, rendendo il controllo antispam ancora più difficile da passare per uno spambot.

$numerocasuale = rand(1,5);

A questo punto inseriremo il metodo che tradurrà il valore generato in una questione da risolvere

function getDomanda($numero) {

 switch ($numero) {
 case 1:
 return "Seleziona uno";
 break;
 case 2:
 return "Seleziona due";
 break;
 case 3:
 return "Seleziona tre";
 break;
 case 4:
 return "Seleziona quattro";
 break;
 case 5:
 return "Seleziona cinque";
 break;
 default:
 return "NESSUNO";
 break;
 }
}

Poi, inseriremo il metodo che convertirà il valore scelto con il radio button nel corrispettivo valore da confrontare

function getNumero($lettera) {

 switch ($lettera) {
 case "mamma":
 return 1;
 break;
 case "papa":
 return 2;
 break;
 case "sorella":
 return 3;
 break;
 case "fratello":
 return 4;
 break;
 case "cugino":
 return 5;
 break;
 default:
 return "NESSUNO";
 break;
 }
}

La configurazione è fatta. A questo punto dobbiamo inserire il radio button nel nostro form, non dimenticandoci di un campo hidden che riporterà il numero generato. Facciamo attenzione ad impostare come valori dei radio button gli stessi della tabella che abbiamo scritto sopra.

<form action="<?php echo $_SERVER['php_self'] ?&gt;" method="post" bla bla bla>
 ...
 Seleziona <?php echo getDomanda($numerocasuale); >
 1 <input type="radio" name="valoreradio" value="mamma"/>
 2 <input type="radio" name="valoreradio" value="papa"/>
 3 <input type="radio" name="valoreradio" value="sorella"/>
 4 <input type="radio" name="valoreradio" value="fratello"/>
 5 <input type="radio" name="valoreradio" value="cugino"/>
 <input type="hidden" name="copianumero" value="<?php echo $numerocasuale; >">
 ...
 ...
</form>

All’interno della procedura dell’azione, inserire la seguente condizione

if ($_POST['copianumero'] == getNumero($_POST['valoreradio'])) {
  esegui la mia azione
}

Se il valore contenuto nel campo hidden è uguale al valore tradotto del valore del radio button, allora esegui la mia azione.

Se qualche spambot riesce a risolvere il quesito vuol dire che basta aumentate il range del numero generato, e quindi anche i quesiti e le risposte, oppure cambiare i valori dei radio button ricordandoci di  cambiare la mappatura del metodo che lo converte.

Fonte immagine: https://news.sophos.com/…

Controlliamo ciclicamente il funzionamento dei link nei nostri articoli. Se noti dei link che non funzionano segnalacelo tra i commenti. Se hai apprezzato l'articolo considera l'idea di sostenere il blog anche con una piccola donazione. Grazie. Patreon / Ko-fi / Liberapay / Paypal

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *