Come evitare lo spam sui form: 2 semplici tecniche

Uno dei più diffusi problemi con cui i proprietari / sviluppatori dei siti web devono interfacciarsi al giorno d’oggi è senza dubbio lo spam. Questo avviene generalmente ogni qualvolta il sito web contenga indirizzi email esposti o form. Più sarà famoso e visitato il sito, più sarà soggetto all’attacco dei cosiddetti “spam robot”. Esistono senz’altro soluzioni complesse ed articolate sul mercato, come ad esempio i cosiddetti CAPTCHA che prevedono l’interazione umana prima che un form possa essere effettivamente inviato e processato. Tuttavia quest’ultima soluzione spesso risulta fastidiosa per i vostri utenti, motivo per cui oggi andremo ad analizzare 2 semplici tecniche che vi permetteranno di evitare attacchi spam in modo del tutto trasparente ai vostri utenti.

Le 2 soluzioni di cui parleremo oggi in questo tutorial prevedono l’utilizzo del linguaggio PHP da integrarsi al pre-esistente codice sul vostro backend.

Prima soluzione: HoneyPot

Questo metodo prevede l’inserimento di un campo (field) di tipo text aggiuntivo nel vostro form che risulterà nascosto agli occhi dei visitatori e che chiameremo “campoNote”.

Così facendo il nostro backend riceverà un form contenente un campo aggiuntivo “campoNote” che sarà necessariamente vuoto qualora un utente “umano” compili lo stesso, mentre nel caso di spam robot, esso tenderà ad analizzare il codice e riempire in modo casuale ogni campo di tipo text trovato.

Qui di seguito il nostro form con il campo honeyPot aggiuntivo evidenziato in giallo:

<form action="backend.php" method="post">
    <label>Nome e cognome:</label>
    <input type="text" name="nomeCognome" />
    <label>Indirizzo email:</label>
    <input type="email" name="indirizzoEmail" />
    <input type="text" name="campoNote" autocomplete="off" style="visibility:hidden;"/>
    <label>Scrivi un messaggio</label>
    <textarea name="messaggio" />
</form>

Come avrete notato il campo ha le seguenti proprietà:

  1. autocomplete=”off” in modo che eventual pre-compilazioni automatiche del form non vi introducano alcun contenuto;
  2. style=”visibility:hidden;” eviterà che il campo venga mostrato all’utente;

Ora vedremo come sarà gestito il tutto lato backend dal nostro script backend.php:

$honeyPot = $_POST['campoNote'];

if (trim($honeyPot) != '') {

    // Rilevato intervento di uno spam robot!!! Non procediamo con l'elaborazione del form

} else {

    // Form inviato da utente "umano"! Possiamo procedere con l'elaborazione!

...

}

Seconda soluzione: Misurazione del tempo

Gli “spam robot” sono generalmente molto rapidi nell’esecuzione delle loro funzioni. Questo significa che dal momento in cui accedono alla vostra pagina a quello in cui il form viene inviato trascorrono pochi secondi. 
Nel caso di utente “umano” invece ciò non accade, sarebbe impensabile visitare una pagina web ed appena 5 secondi, aver letto, compilato ed inviato il form.

La logica di questa tecnica è infatti quella di misurare il tempo intercorso tra il caricamento della pagina e quello di esecuzione dello script di backend.

Molti spam robot evoluti sarebbero in grado di gestire tale tecnica qualora indicassimo “in chiaro” il tempo espresso in secondi, per questo motivo faremo in modo da passare tale informazione mediante uno script di cifratura appositamente realizzato.

Per far questo realizzeremo uno script di cifratura che salveremo su un file esterno e che includeremo sia sulla nostra pagina web contenente il form che sul nostro backend.php.

Il nostro form conterrà stavolta un campo di tipo “hidden” chiamato “formLoad” che conterrà il tempo in secondi (UNIXTIME) cifrato dal nostro script:

<?php require "encryptor.php"; ?>
<form action="backend.php" method="post">
    <input type="hidden" name="formLoad" value="<?php echo Encryptor::encrypt(time()) ?>" />
    <label>Nome e cognome:</label>
    <input type="text" name="nomeCognome" />
    <label>Indirizzo email:</label>
    <input type="email" name="indirizzoEmail" />
    <label>Scrivi un messaggio</label>
    <textarea name="messaggio" />
</form>

Il file contenente l’algoritmo di cifratura e de-cifratura sarà composto come di seguito. Trattandosi di uno script dimostrativo ho usato l’algoritmo base64 di PHP, tuttavia esistono altre librerie utilizzabili per ottenere un risultato più sicuro e non prevedibile dagli spam bot.

<?php
class Encryptor {
    static function encrypt($value) {
        $encryptedValue = base64_encode($value);
        return $encryptedValue; 
    }
    static function decrypt($value) {
        $decryptedValue = base64_decode($value);
        return $decryptedValue; 
    }
}
?>

Vediamo ora come aggiungere il codice per la validazione sul nostro backend.php

...
require "encryptor.php";
define("MIN_TIME_TO_FILL_FORM", 5); // definiamo il tempo minimo in cui un utente "umano" potrebbe aver compilato il form (ad esempio 5 secondi)
$encryptedLoadedFormTime = $_POST['formLoaded6tY4bPYk']; //recuperiamo il valore temporale cifrato proveniente dal form
$loadedFormTime = Encryptor::decrypt($encryptedLoadedFormTime); // decifriamo il valore recuperato
$formFilledInSeconds = time() - $loadedFormTime; //calcoliamo la differenza tra l'istante in cui in nostro backand processa la richiesta e la compilazione del form

if(!isset($encryptedLoadedFormTime) || $formFilledInSeconds < MIN_TIME_TO_FILL_FORM) {
    // Rilevato spam robot! Non proseguiamo con l'esecuzione
    exit('Spam Bot rilevato!');
}
// Utente "umano"! andiamo avanti con la nostra elaborazione del form
...

Considerazioni finali

E’ buona pratica salvare su log gli attacchi ricevuti dagli spam robot in modo da poterli analizzare successivamente. Consigliamo quindi l’implementazione di un sistema di tracciatura che sarà; eseguito ogni qualvolta uno Spam robot viene rilevato. E’ altresì importante recuperare l’indirizzo IP da cui l’attacco proviene così; da poterlo confrontare e segnalare alle blacklist publiche. Esistono progetti gratuiti di mutua cooperazione in merito come ad esempio PROJECTHONEYPOT.ORG

Le due soluzioni proposte in precedenza possono essere implementate contemporaneamente, creando così un metodo di protezione ancora più; robusto ed efficace.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.