Home > InfoTech > Un CAPTCHA senza javascript matematica o immagini

Un CAPTCHA senza javascript matematica o immagini

November 29th, 2007 Lascia un commento Vai ai commenti

Come fare un captcha facile senza javascript, un po’ di css e un po’ di server side (coldfusion): un gioco da ragazzi. Procediamo! Ipotizziamo che il nostro modulo (form) sia fatto nel seguente modo: <form name="frm_xxx" action="reg.cfm" method="post"> Nome <input type="text" name="nome"><br /> Sito <input type="text" name="sito"><br /> Mail <input type="text" name="mail"><br /> Commento<br> <textarea name="commento"></textarea> </form> Mi sembra abbastanza standard, ok? Mettiamoci nei panni dello spider che invia i moduli di spam: entra dentro, legge gli input, invia il modulo simulando http.referer e tutti i campi input con le sue parole si spam (cattivo…). Perfetto: facciamo il suo gioco, inseriamogli un bel campo input… che però lo vede solo lui e non gli utenti.

<!— SISTEMA CON CAPTHA NON TRADIZIONALE —> <div style="visibility:hidden"> Non inserire testo nel campo sotto. Altrimenti non riuscire più a commentare.<br /> <input type="text" name="campoNascosto" value="" style="width:1px;height:1px;font-size:1px;" /> </div> Come nasconderlo, semplice un po’ di CSS, in questo caso scritto nel codice HTML, ma possiamo usare benissimo delle classi, oppure dichiarare nel DIV contenitore di nascondere tutti gli input etc. Attenzione! Non usare display:none altrimenti il campo input nascosto non viene inviato alla pagina destinataria (reg.cfm). Ultimo pezzettino di fatica, facciamo un controllo nella pagina di registrazione del modulo, in modo che l’esito sia positivo solamente se il campoNascosto esiste ed ha valore "" (vuoto).

<cfif not(isDefined("form.campoNascosto") and form.campoNascosto is "")>

Attenzione. Modulo non registrabile! <cfabort>

</cfif> La versione in php invece "fà" così (by DvD): if ( (array_key_exists("campoNascosto",$_POST))) { if ($_POST["campoNascosto"]<>"") { die ("Attenzione. Modulo non registrabile!"); } La versione in asp: <% function existsFormParam(name) existsFormParam = (Request.Form(name).Count = 1) end function if (existsFormParam("captcha") and Request.Form("captcha") = "") then Response.write("ok") else Response.write("no") end if %> Et violà il gioco è fatto. Finora il sistema (qualche settimana) sembra tenere senza problemi, è chiaro che se qualcuno fa un "auto-commentatore" ad hoc buca facilmente il sito, al più di fare random il nome del campoNascosto, e memorizzarlo in una variabile di sessione o una variabile client. Il sistema javascript-less permette l’utilizzo dei moduli anche da parte dei signori con js disabilitato. *** Attenzione, il futuro di questa soluzione ha un nome e un plugin per Wordpress: HIDDY! ***

 

Approfondimenti online

La tecnologia informatica ha fatto passi da gigante. In modo particolare Google, che con il suo analizzatore di testo, è in grado di proporre collegamenti contestuali a quanto hai appena letto. Questi i link pubblicitari proposti da Adsense.

Categorie: InfoTech Tag: ,
  1. April 26th, 2007 at 19:14 | #1

    Carina come idea, anche se… reggerà solo finchè gli spammer non mangeranno la foglia :-)

  2. April 26th, 2007 at 22:25 | #2

    In un mese e mezzo per ora non l’hanno ancora bucata. Speriamo bene – altrimenti troveremo un’altra soluzione, no?

  3. May 25th, 2007 at 09:38 | #3

    secondo me è piuttosto inattaccabile

  4. May 25th, 2007 at 09:42 | #4

    Ti dirò certezze ce ne sono poche, però fino adesso ha tenuto bene e ha filtrato tutto quanto.

  5. June 21st, 2007 at 16:42 | #5

    Idea stupenda!

  6. June 21st, 2007 at 16:47 | #6

    Addirittura stupenda. Grazie mille.
    Mi fai arrossire.

  7. July 29th, 2007 at 23:30 | #7

    Ottima soluzione, qui viene premiata l’originalità cioè la capacità di distinguersi dalla massa.

    Lo SPAM vuole la massa ;) xkè di fatto è vero…è facilmente scavalcabile…xò chi si prende la briga di modificare i bot di spam solo per i 3/4 utenti che usano questa soluzione? nessuno (x ora).

    Grande Merlinox!

  8. July 30th, 2007 at 09:24 | #8

    Purtroppo questa soluzione non ha fatto il successo che speravo. Come dice il buon Napolùx è perchè non l’ho standardizzata.
    Sono comunque mesi che la uso con zero spam.

    In compenso in 2 giorni ho ricevuto oltre 150 trackback di spam!

  9. July 30th, 2007 at 10:19 | #9

    Eh si, per i trackback-spam con quella soluzione non combini niente…ma non avresti combinato niente nemmeno con il CAPTCHA :)

  10. July 30th, 2007 at 10:24 | #10

    Infatti. Non volevo dire quello. Volevo solo dire che è un’altra rottura di palle :)

  11. September 10th, 2007 at 22:55 | #11

    Ciao, nella ricerca di come bloccare lo spam nella mia sezione link, questa è l’idea più originale che abbia mai trovato.
    Vorrei inserirla nella mia sezione ma sarà l’ora sarà che sono un pò ottuso mi mancano alcuni passaggi.

    Puoi per cortesia contattarmi per aiutarmi passo passo o quanto meno dirmi se posso usare anch io questa tecnica nella mia sezione link?

    Ti ringrazio anticipatamente.

  12. September 11th, 2007 at 09:27 | #12

    @gianni: grazie mille. ti ho mandato una mail all’indirizzo che hai indicato. ti confermo che funziona alla grande.

  13. September 13th, 2007 at 18:54 | #13

    Ed ecco qui ora lo proviamo anche su meemi ;o) grazie guagliò http://www.meemi.com/buzzz/meme/282

  14. September 15th, 2007 at 12:35 | #14

    Salve a tutti, ho appena trovato questo utilissimo blog che potrebbe risultare utile alla soluzione del problema Spam.
    Purtroppo non sono molto pratico e mi servirebbe una guida passo passo o in altrnativa un esempio di form ( in modo da adattare il form del mio sito) nel quale è implementato lo script!

    Un saluto e grazie

  15. September 16th, 2007 at 23:10 | #15

    @capobecchino: Miticissimo. Sono onorato!
    @baglieri: hai praticamente tutto scritto, cmq se hai dei dubbi scrivi pure che vediamo come risolvere il problema :)

  16. September 17th, 2007 at 09:02 | #16

    Buongiorno Merlinox,

    in pratica non so dove inserire il seguente codice:

    Attenzione. Modulo non registrabile!

    Saluti e grazie

  17. September 17th, 2007 at 09:44 | #17

    Lo devi inserire all’inizio della pagina che riceve il form.
    Purtroppo sono le basi del funzionamento server side. Bisogna che ci diamo una ripassata per mettere le mani sulle pagine, non vorrei altrimenti che nascessero casini nei vostri siti.

  18. October 23rd, 2007 at 20:11 | #18

    Ottima idea… la proverò

  19. October 23rd, 2007 at 20:17 | #19

    Un sistema per migliorarlo è creare un numero variabile (magari random) di campi nascosti
    da far apparire

    In questo modo c’è maggiore probabilità di far saltare gli spider ….

  20. October 24th, 2007 at 09:20 | #20

    Ciao ragazzi, vi segnalo che è uscito il plugin per Wordpress fatto da k76 su questa base.

    http://hiddy.etechs.it

  21. November 27th, 2007 at 15:21 | #21

    Si’ e’ carina come idea, l’ho vista utilizzare anche io su alcuni forum.
    Pero’ e’ ancora piu’ interessante sapere quanto ci metteranno gli spammer a scoprire il trucco.. :)

  22. November 27th, 2007 at 15:26 | #22

    Grazie Giovanni. L’idea è stata notevolmente sviluppata nel progetto Hiddy: se ne parla parecchio in giro nella blogosfera e soprattutto nell’ambiente WordPress.

    http://hiddy.etechs.it
    http://tinyurl.com/399dpa

  23. Inchiostro Simpatico
    November 29th, 2007 at 14:10 | #23

    Ottima idea!

    Ho effettuato una piccola variazione, ovvero ho tenuto solo l’input nel seguente modo:

    Ovviamente lo script php è rimasto identico….secondo voi senza il tag funziona lo stesso? Io penso di si.

    Grazie mille!

  24. November 29th, 2007 at 14:18 | #24

    @inchiostro: purtroppo non si vede il codice che hai postato. Se sei un WP user usa http://hiddy.etechs.it
    Altrimenti ci sentiamo per mail, magari hai una ottima soluzione alternativa!

  25. Inchiostro Simpatico
    November 29th, 2007 at 14:27 | #25

    Ho notato…in soldoni ho tolto il tag DIV ed utilizzato solo il tag INPUT NAME=”…” utilizzando TYPE=”hidden”.

    In questo modo credo di ottenere lo stesso risultato utilizzando un generico tag DIV per tutto il mio form.

  26. November 29th, 2007 at 14:36 | #26

    Al 90% penso funzioni. Ma se uno spider è un pelo più evoluto sa che deve lasciare stare gli hidden, che solitamente sono di servizio!

    io manterrei text con style visibility:none;width:0;height:0;font-size:0;

  27. pino
    December 21st, 2007 at 10:47 | #27

    premesso che l’idea non e’ tua, coglione, ci vuole molto a istruire un bot a non riempire i campi che hanno “display:none” nel css?

    sei proprio un coglion

  28. December 21st, 2007 at 10:57 | #28

    @pino: non meriti risposte. tecnicamente comunque puoi creare chiaramente un bot per qualsiasi cosa. in molti mesi di test nemmeno più un bot ha colpito questo blog. al più dei bot della gente con poco cervello… ma quello è inevitabile.

    evoluzione della mia idea hiddy, con molti più controlli variabili, che i bot non prevedono!

  29. December 21st, 2007 at 11:01 | #29

    cha isa una questione di gelosia?

    dai va su su. hiddy funziona, e per ora gli spambot non sono stati sitruiti a tal riguardo.

    il discreto successo di hiddy, il plugin per wordpress, sta proprio sul fatto che abbiamo evoluto il concetto che sta su qeusto post.

  30. edonista
    February 17th, 2008 at 14:54 | #30

    A me non funziona, nel senso che non va’ propio.
    Uso php e ho copiato il relativo codiche che non funge…

    Da ignorante mi salta all’occhio questo doppio “if” ma presumo che la sintassi sia corretta cosi come l’hai scritta tu:

    IF ( (array_key_exists(“campoNascosto”,$_POST)))
    {
    IF ($_POST["campoNascosto"]“”)
    {
    die (“Attenzione. Modulo non registrabile!”);
    }

    Il codice mio della pagina di inserimento è:

    <?php

    include (“includes/config.php”);

    $email=$_POST["email"];
    $message=$_POST["message"];

    $query=”INSERT INTO table(email, message) VALUES(‘$email’,'$message’, now())”;

    if (!mysql_query($query, $db))
    {
    print (“commento non inserito”);
    }
    else
    {
    echo (“commento inserito! HOME“);
    }
    mysql_close($db);
    ?>

    Ho provato a inserire il tuo codice prima di config.php e dopo ma da sempre un errore ad una linea del testo che va oltre la fine del codice…
    puoi aiutarmi?

  31. February 17th, 2008 at 16:57 | #31

    Ciao Edonista, se lavori su piattaforma Wordpress salta ogni problema e usa direttamente http://hiddy.etechs.it

    Se invece il problema è in un sito PHP ho inoltrato la tua segnalazione all’autore della traduzione in PHP, il mitico DVD!

  32. February 18th, 2008 at 09:38 | #32

    @Edonista: Senza errore diventa veramente difficile capire di cosa si potrebbe trattare. Cmq il doppio if serve per verificare che effettivamente esista il campo ‘Hiddy’ prima di valutarne il contenuto in modo da non sollevare problemi.

    Se ti risulta più facile da capire puoi modificare il codice in questo tratto da quello che ha fatto Enrico per Hiddy:

    if (isset($_POST[$val]) && empty($_POST[$val])) {
    $found=1;
    }

    La funzione isset sostituisce array_key_exists(”campoNascosto”,$_POST)

    Byez

  33. edonista
    February 18th, 2008 at 10:20 | #33

    Grazie mille DVD! Ora mi “suona” tutto piu’ chiaro :) )

  34. Leo
    February 29th, 2008 at 19:47 | #34

    Sono alquanto noob in queste cose, ma mi domando a cosa serve il tag style nell’input, se non è necessario non sarebbe meglio toglierlo, per renderlo più anonimo possibile? e ancora, descrivere le caratteristiche del div (visibility:hidden;) in un file css esterno aiuta a migliorare la protezione, o è esattamente la stessa cosa?
    Scusate se queste domande sono stupide o se hanno risposte ovvie ma sono solo agli inizi… grazie 1000 per l’attenzione

  35. March 1st, 2008 at 17:13 | #35

    Hai ragione. E’ solo per destabilizzare un po’ il codice e/o eventuale lettore :)

  36. Fabrizio
    May 29th, 2008 at 22:51 | #36

    Ritengo che Hiddy sia tanto semplice quanto geniale. A quando un plugin per joomla?

  37. May 30th, 2008 at 07:50 | #37

    Grazie Fabrizio, troppo buono. Per quanto riguarda Hiddy, io ci ho solo messo l’idea e la versione “manuale” in coldfusion. Il resto è opera di quel genio di k76. Per quanto riguarda Joomla temo che qualcun’altro dovrebbe proporsi. K76 la vedo dura, e io ho un pessimissimo rapporto con quel “coso” chiamato joomla :)

  38. July 16th, 2009 at 14:28 | #38

    Per chi come è già vittima di spam e aggiunge solo dopo questa utile funzionalità faccio presente che il seguente codice (PHP) non risolve interamente il problema:

    if ( (array_key_exists(“campoNascosto”,$_POST))) { if ($_POST["campoNascosto"]“”) { die (“Attenzione. Modulo non registrabile!”); }

    infatti tutte le chiamate che non includono “campoNascosto” passano via lisce. Questo è dovuto al doppio IF che considera SPAM solo le chiamate in cui il campo esiste ed è valorizzato e non quelle in cui il campo proprio non viene inviato. Ho fatto questa piccola modifica:

    if ( (array_key_exists(“campoNascosto”,$_POST))) {
    if ($_POST["campoNascosto"]“”) {
    die (“Attenzione. Modulo non registrabile!”);
    }
    } else die (“Attenzione. Modulo non registrabile!”);

    nemo

  39. July 16th, 2009 at 16:48 | #39

    Grazie Nemo per la segnalazione. La soluzione in PHP me l’ha tradotta un amico. La faccio verificare immediatamente.

  1. January 29th, 2008 at 10:35 | #1
  2. February 28th, 2008 at 09:21 | #2
  3. July 3rd, 2008 at 20:55 | #3
  4. July 30th, 2008 at 15:37 | #4
  5. November 14th, 2008 at 16:11 | #5
  6. November 21st, 2008 at 10:57 | #6
  7. November 21st, 2008 at 11:01 | #7

Additional comments powered by BackType