Elucubrato da saibal
Addì 22 Marzo 2013
Rivisitazione della tecnica “honeypot” per moduli antispam senza captcha – UPDATE
La pagina di invio
La pagina di invio prevede delle verifiche sui campi in arrivo. Il codice è stato volutamente scritto separando ogni controllo per illustrare meglio i passi eseguiti; anche in caso di spam conclamato verrà inviata una email a scopo di debug. È ovvio che un codice di produzione dovrà essere rivisto in maniera più razionale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | <?php /* * Filename: result1.php */ $now = time(); $minsec = 2; // il metodo di invio è post if ($_SERVER['REQUEST_METHOD'] == 'POST') { // esiste il campo con la data e non è vuoto if (!empty($_POST['formtime'])) { // il campo con la data è numerico if (is_numeric($_POST['formtime'])) { // la data di invio è futura rispetto a quella del form if ($now > $_POST['formtime']) { // il tempo trascorso tra il caricamento e l'invio è maggiore di n secondi if (($now - $_POST['formtime']) > $minsec) { // il campo fake è vuoto if (isset($_POST['name']) && empty($_POST['name'])) { $result = "messaggio scritto da umani"; } else { $result = "bot: riempito campo fake o mancante"; } } else { $result = "bot: troppo veloce - tempo di invio: " .($now - $_POST['formtime']). " secondi"; } } else { $result = "bot: troppo veloce - tempo: futuro"; } } else { $result = "bot: time manomesso"; } } else { $result = "bot: manca timestamp"; } } else { $result = "bot: la request è diversa da POST"; } /**************** INVIO EMAIL ******************/ $dest = "tuaemail@provider.com"; $headers = "X-Mailer: PHP ".phpversion()."\n"; $headers .= "From: $_POST[email] <$_POST[email]>\n"; $headers .= "Return-Path: $dest <$dest>\n"; $headers .= "Reply-To: $dest <$dest>\n"; $headers .= "Date: ".date("H:i:s")." ".date("d/m/Y")."\n"; $headers .= "Delivered-to: $dest <$dest>\n"; $headers .= "MIME-Version: 1.0\n"; $corpo = "ora invio: " .$now. "\n ora form: " .$_POST['formtime']. "\r\n" .stripslashes($_POST["message"]); if (isset($_POST["name"]) && !empty($_POST["name"])) { $corpo .= "\r\n honeypot:" .stripslashes($_POST["name"]); } //invio dell'email mail($dest,$_POST['host']." ".$result,$corpo,$headers); echo $result; ?> |
La variabile “$minsec” indica i secondi che devono passare tra la visualizzazione del form e l’invio. Il valore ottimale si ottiene valutando caso per caso: è ovvio che su un modulo di un solo campo senza validazione obbligatoria, anche 1 secondo potrebbe generare molti falsi positivi. In genere 2 secondi dovrebbe essere un buon compromesso.
I successivi controlli sono abbastanza chiari. Sostanzialmente si verifica che:
- il metodo di invio sia POST
- il campo “formtime” esista e non sia vuoto
- il campo “formtime” sia numerico
- il campo “formtime” sia inferiore alla data di invio
- il tempo trascorso tra la visualizzazione del form e l’invio non deve essere inferiore a “$minsec”
- il campo “name” deve esistere ed essere vuoto
Superati questi controlli allora si può procedere con l’invio del modulo.
Prima di passare allo step successivo, alcune considerazioni su questo esempio.
Il beneficio principale è, probabilmente, la velocità di implementazione. I controlli inseriti sono banali e non richiedono molta logica. Di contro, a tanta semplicità, si contrappone una situazione abbastanza vantaggiosa per uno spammer professionista che, con un po’ di pazienza e con il tasto “indietro”, potrà effettuare invii multipli senza troppe difficoltà. Tra l’altro il non aver reso random il nome del campo “honeypot” di certo favorisce i software malintezionati.
È necessario, quindi, introdurre qualche controllo aggiuntivo.

Vota: %SAIBAL_PERCENTAGE%%
bell’articolo! complimenti!!!
l’ho provato e funziona bene come tecnica