Tempo di Lettura: 3 minuti
Qualche mese fa, stanco di aver un captcha grafico poco accessibile (anche a detta del W3C), ho introdotto nell’area commenti del mio blog, un captcha matematico, in grado di reggere le ondate di spam che imperversano sulla rete. L’idea era semplice e originale: installando un semplice plugin per WordPress (Math Comment Spam Protection Plugin) e aggiungendo del semplice codice php nella posizione voluta nel file comments.php, era possibile vincolare l’inserimento di nuovi commenti alla risposta di una semplice domanda che richiedeva elementari conoscenze matematiche: “Quanto fa 3+5?”.
Ebbene, nonostante la semplicità dell’operazione, prendendo spunto dal geniale Daniele, ho introdotto una ulteriore facilitazione: se il vostro browser ha abilitato il supporto per Javascript (e se anche prima era quasi sempre consigliata la disattivazione, oggi con tutte le applicazioni Ajax che girano, è quasi d’obbligo averlo attivo) potrete vedere che il campo in cui dovevate scrivere il risultato della somma algebrica, risulta ora già precompilato con la risposta esatta.
Ho deciso di adottare anche io questo metodo, perché, ho ipotizzato che un classico bot di spam non usa un browser per inviare commenti, e quindi non dovrebbe mai avere accesso a questa funzione javascript. Certo il codice potrebbe essere semplicemente bypassabile dato che i numeri vengono compresi in un 2 tag SPAN; inoltre dato che i bot usano soluzioni di massa, una soluzione “amatoriale e di nicchia” potrebbe risultare molto efficace.
Al momento sono ancora in fase di test per valutare se questa soluzione è apprezzata e se vi è un eventuale incremento dello spam: al momento in cui scrivo e dopo una settimana di prove mi pare che lo spam sia rimasto sempre lo stesso.
Come funziona
Adesso è arrivato il momento di spiegare come implementare questa semplice soluzione. Unico prerequisito è avere installato il plugin per WordPress Math Comment Spam Protection Plugin (anche se, opportunamente adattato, funzione senza problemi con altri plugin simili o soluzioni proprietarie).
Sul sito dell’autore del plugin, viene riportato il codice da inserire nel file comments.php del proprio tema.
A questo codice, occorre inserire il seguente codice js:
Quindi, occorre separare ogni numero generato casualmente attraverso i TAG SPAN e assegnandogli un ID univoco:
In questo modo ogni operatore della somma è identificato univocamente: il primo sarà il valore dello span con ID “num1” e il secondo quello con ID “num2“. Il codice Javascript sopra riportato, quindi, non fa altro che prendere questi due valori (attraverso l’uso di document.getElementById) e sommarli tra di loro. Il risultato andrà poi scritto nel valore del campo testuale document.commentform.mcspvalue.
Occorre, ora, fare una precisazione: quasi tutti i temi per WordPress, quando dichiarano il form dei commenti, usano assegnare solo l’ID e non il NAME. Per far funzionare il codice Javascript e non incorrere nel terribile errore di Warning “commentform has no properties“, occorre aggiungere dopo id=”commentform” anche questa stringa: name=”commentform” per ottenere quindi la seguente riga:
quello che non ho mai capito è perché, se questi sistemi funzionano, allora lo spam non viene azzerato… come fanno a passare?
Beh, io sono rimasto alla solita immagine con dei numeri da copiare in un campo. E per ora tutto funziona a meraviglia. Mi sono fatto tutto in php, l’immagine la creo con le GD2.
@Davide: il fenomeno è un pò lacunoso anche per me. Quel che è certo è che parte dei commenti di spam in realtà sono anche trackback di spam
@DnaX: in effetti non mettevo in dubbio la validità dei captcha grafici, ma solo la loro non accessibilità per un ipovedente.
Ciao,
in occasione del restyling del mio blog, ho provato a sostituire il captcha che utlizzavo prima con questo matematico. E ovviamente ad implementare il javascript come suggerisci nell’articolo, che è in effetti molto comodo.
Ma qualcosa è andato storto: il plugin base funziona alla perfezione (ho fatto alcuni test) ma se aggiungo le tue modifiche ottengo risultati disastrosi, che non sono in grado di risolvere da solo purtroppo.
Succede che la pagina viene caricata a metà, l’intera sezione con i form per inserire i commenti sparisce ed al suo posto compare questo messaggio:
Parse error: syntax error, unexpected ‘?’ in /var/www/netsons.org/ilsolenudo/wordpress/wp-content/themes/deliciously_blue/comments.php on line 95
Ho ricontrollato il codice ma nonostante qualche piccola modifica che credevo avrebbe risolto, sono ancora bloccato. Ho controllato tutti i punti interrogativi…
Il fatto è che trovare la fatidica line 95 è ostico perchè il layout è fluido ^_^
Qualche idea su dove sbaglio? Sicuramente sarà una cosa stupidissima!
grazie
anche io ho lo stesso errore.. nella linea 96 però.. qualcuno ha risolto?
Il codice postato da Antonio è sbagliato; o almeno lo era per me 🙂 L’ho corretto, provo ad incollarlo qui, ma non so se appariranno numeri di linea e/o cose simili; nel caso ovviamente vanno tolti!
——- COPIARE DA QUI IN POI ——–
@Dario: Guarda ho riapplicato questo codice anche sul nuovo tema e non ho incontrato alcuna difficoltà a farlo funzionare. Che problemi ti dava? Che modifiche hai apportato? Io non ho trovato, ad una prima occhiata, alcuna differenza tra il codice che ho scritto io e quello postato da te.
Ciao
Allora, c’erano dei problemi con le spaziature, tipo invece di <?php avevo copincollato < ?php oppure <? php … e non mi accorgevo degli spazi quindi ci ho messo un po’ a fare il debug. Facci caso, prova a copincollare dall’ultimo riquadro, dove dici “in definitiva” etc etc etc … li’ addirittura manca il <?php iniziale 😉
In ogni caso, grazie davvero del tutorial, mi è stato utilissimo; e però mi chiedo: posto che se l’utente ha javascript abilitato la somma viene fatta automaticamente, perchè a questo punto non nascondere il campo utilizzando sempre javascript? Si inserisce il tutto in un bel div con il suo id e lo si nasconde subito dopo aver generato la somma! Che ti pare? 😉 Au revoir!
@Dario: se clicchi su “view plain” avrai la versione del codice in puro ascii e senza alcuna formattazione o tabulazione. Penso che così risolvi il problema delle spaziature.
Per l’idea di nascondere il campo della somma devo dire che è molto buona …. grazie mille 🙂