Proteggere le form di Drupal dallo spam con la tecnica HoneyPot

Proteggere le form di Drupal dallo spam con la tecnica HoneyPot

Quante volte vi siete ritrovati con decine e decine (se non migliaia)  di contatti palesemente finti nelle vostre liste?

Quasi sempre la soluzione più ovvia è l'odioso captcha che molto spesso è impossibile da leggere e che dopo l'ennesima volta che si sbaglia, costringe l'utente a rinunciare a compilare la form. 

Esiste un'altra soluzione non particolarmente conosciuta, ma molto valida: la tecnica dell'HoneyPot (letteralmente "Vaso di Miele").

Come avviene per attirare l'orso in una trappola,, la tecnica consiste nell'inserire una "trappola" per il bot con un campo di testo racchiuso in un div nascosto. Così il campo non sarà visibile all'utente, ma lo sarà per un bot che vedendo un campo di testo, non vedrà l'ora di riempirlo con dello spam. Basterà, poi, fare un controllo quando la form viene inviata: se il campo non è vuoto, allora sarà riempito sicuramente da un bot.

Tecnica HoneyPot applicata a Drupal 8.x

Potete inserire il codice nel file nometemplate.theme nella cartella del template (se non avete voglia di crearvi un piccolo modulo):

function tuotemplate_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state,$form_id) {
        
	switch($form_id) {

        	case 'id_della_form_da_proteggere': // puoi aggiungere un case con l'id di ognuna delle form che vuoi proteggere

               		$form['nome_campo_honeypot'] = array(
				'#title' => 'titolo_del_campo',
				'#type' => 'textfield',
				'#title_display' => 'invisible',
				'#required' => false,
			);
			
			$form['nome_campo_honeypot']['#prefix'] = '<div style="display: none;">' ;
    			$form['nome_campo_honeypot']['#suffix'] = '</div>' ;

			$form['#validate'][] = 'honeypot_form_validate'; //questo valore indica alla form di chiamare la funzione honeypot_form_validate durante il validate
			
			break ;
	}
}

Con la funzione precedente, non si farà altro che aggiungere a tutte le form dichiarate nello switch, un campo di testo invisibile perchè racchiuso in un div che ha una proprietà "display: none;". Inoltre a queste form viene sostituita la funzione che ha lo scopo di controllare i campi, perciò subito dopo questo codice è necessario inserire questa funzione:


function honeypot_form_validate($form, FormStateInterface &$form_state) {
	$campo_da_controllare = $form_state->getValue('nome_campo_honeypot');

 	if ($campo_da_controllare != "") {
      		$form_state->setErrorByName('nome_campo_honeypot', 'Tu sei un bot! Vai via!');
  	}
}

Per la buona riuscita di questa tecnica, non dovreste mai utilizzare nomi per il campo honeypot che sia riconducibile alla tecnica che stiamo usando:non utilizzate mai termini come "honeypot", "antispam" o cose simili. Il bot potrebbe accorgersene. Lavorate un po' di fantasia.