Come integrare un antispam nei nostri form php

Come integrare un antispam nei nostri form php

Seguendo l’idea che sta alla base di Hiddy, mi sono fatto il mio personale antispam.

Il mio form di solito si compone di un singolo file PHP dove c’è tutto dentro: il form vero e proprio e il codice PHP che serve a spedire l’email.
L’idea alla base di Hiddy, per chi non lo sapesse, è di accantonare captcha vari per qualcosa di molto più semplice, che – detto terra-terra – lo metta  in quel posto agli spam-bots!

I robot che spammano riempiendo tutti i form che trovano nel web seguono una semplice regola: riempi tutti i campi del form prima di spedirlo.
BENE! Basandoci su questo semplice presupposto basta inserire un campo testo che non deve essere riempito per poter validare il form!

A questo punto, senza dilungarmi sulle altre ovvie implementazioni di sicurezza, l’implementazione del nostro anti-spam si fa in 3 fasi:

  1. inserire un campo testo
  2. nascondere il campo testo ai bots
  3. verificare che il campo testo è vuoto

Inserire il campo testo è semplice (html):

<input name="antispam" type="text" id="antispam" value="" />

Nasconderlo ai bots è altrettanto semplice, applicando uno stile al campo testo; i robots sono scemi e non capiscono che quel campo è visibile solo a loro e non agli navigatori normali. (css):

style="display:none"

Verificare che il contenuto sia inalterato, al momento in cui il nostro codice PHP analizza i dati ricevuti dal form (php):

if ($antispam != '') { die("errore antispam"); }

Volendo esagerare, al posto di un campo testo vuoto si può scriverci una parola di sicurezza, che se cambiata invalida il form.
Mi pare tutto chiaro, no? 🙂

Ancora antispam

(riporto di seguito un articolo che avevo pubblicato nel marzo 2007)

Succede di mettere un form di contatti in un sito web e vedersi la casella di posta inondata dallo spam. Questo script in PHP genera un’immagine che contiene un codice di sicurezza (conosciuto come Captcha), che è poi usato per proteggere un form dagli spam-bots.

Inserendo una password all’interno di una immagine – in modo che non possa essere letta da un software OCR – e chiedendo all’utente di riscrivere la password si è sicuri che l’utente è proprio umano e non un automatismo incaricato di compilare qulasiasi form che trovi nel web.

scarica il file ZIP contenente tutto il necessario:

  • CaptchaSecurityImages.php (contiene la funzione che genera l’immagine con psasword)
  • form.php (è un form di esempio che implementa la funzione descritta)
  • monofont.ttf (è il font usato dalla funzione PHP)

link all’articolo in inglese

AGGIORNAMENTO 06/06/07

Un metodo molto più semplice può essere quello di scrivere, vicino ad un campo testo, una cosa tipo “Scrivi la somma di sedici più due” che qualsiasi persona può facilmente tradurre in “18″ ma che risulta difficile per uno spambot; oppure “In che pianeta vivi?”, “Quante teste hai?” e altre frasi simili che richiamano un’ovvia prola chiave.

Quindi, analizzando il contenuto fornito in quel campo testo, si può dedurre se il messggio è genuino oppure no.

Altri sono arrivati qui cercando:
antispam php, form antispam, php antispam, mail da form come spam.

18 pensieri su “Come integrare un antispam nei nostri form php”

  1. Adesso si che l’ho capito. Grazie. 🙂
    L’unica cosa che posso dirti è che funziona! Anche su WP lo spam è pochissimo. Quel poco che arriva analizzando i log pare proprio fatto a manella.

    Cmq su hiddy c’è molto di più della mia umile idea.

    p.s.: grazie per il link!

  2. No mi ha fatto piacere il tuo post e conoscere il tuo blog che non conoscevo. Anzi l’ho inserito in bloggeritaliani.com, spero non ti dispiaccia.

  3. decisamente una bella idea! molto più visitor friendly dei numeri di verifica.
    però il mio form è in html e non so in che punto piazzare la riga style=”display:none”
    il resto è tutto chiaro (e funzionante: grazie per la dritta).
    ciao,
    Spino.

    ps: nel caso ti andasse di spiegarmi dove ficcare il display none ti scrivo sotto l’indirizzo della pagina.

  4. Ad esempio così, inserendo lo stile nel campo input nascosto:
    input style="display:none" name="frase" type="text" id="frase" value=""
    Nel tuo caso però penso sia meglio inserire lo stile dentro il tag TR della riga della tabella che contiene il campo da nascondere:
    tr align="center" valign="middle" style="display:none"

  5. grazie davvero fratello!
    non ho parole per la tua tempestività: stamattina non potevo credere ai miei occhi nel trovare già la soluzione… evidentemente credi seriamente alla condivisione del know how!
    ti devo comunque un favorone!
    con riconoscenza,
    Spino.

  6. allora… per dovere di completezza, e anche per ricambiare la consulenza dell’ottimo Doz, vi aggiorno sulla mia situazione di spammato.
    anche dopo aver corretto il form ho continuato a ricevere spamming in modo massivo, dallo stesso spider (identici messggi).
    siccome credevo nel metodo suggerito da DoZ, sono “andato in puzza” e ho cercato di capire come fosse possibile.

    il mio form si compone di tre elementi (ok sarebbe meglio uno solo in php ma io sono un novellino): il form in html, la pagina php che manda la mail (send.php) e un’altra pagina html che conferma l’avvenuto invio e offre un menu di navigazione.
    seguendo i consigli ho cambiato i primi due ma lo spam continuava.
    brevemente: mi è venuto il sospetto che lo spammer avesse memorizzato i dati da mandare al send.php, aggirando così il campo trappola presente nel file html.
    a questo punto ho cambiato la locazione del file php (semplicemente rinominandolo in “sendMail.php” e lo spam è cessato (prima ne arrivavano almeno 5 al dì).

    dunque confermo che il metodo è efficace: se lo si usa in maniera preventiva è sufficiente aggiungere il campo trappola; se si è già vittima dello spam basta cambiare nome al php che esegue l’ordine.
    non sono per niente certo del nesso causale (che lo spammer memorizzi le istruzioni da mandare al php, e cioè riempire solo i soliti campi e non tutti, è solo una ipotesi deduttiva) ma posso assicurare che il rimedio è efficace.

    grazie ancora DoZ.

  7. @DoZ: se la vuoi fare ancora più “figa” puoi mettere il nome del campo random e memorizzarlo in un cookie. E nell’altra pagina verifichi la presenza del cookie etc…. gestendo scadenze e quant’altro. 😉

  8. @Spino: si, cambiando il nome allo script aggiri il problema ma per poco
    gli spammer hanno liste di url con i vari form da riempire
    se te gli sposti il form si, non ricevi spam
    ma al prossimo giro del crawl trovano il nuovo form e ricominci tutto da capo

    @Doz: utile come soluzione, ma non si sa mai cosa va a capire google
    display=none -> testo nascosto, penalizzazione, ban
    continuo a preferire i vecchi captcha, le equazioni matematiche
    o le baggianate di billy http://research.microsoft.com/en-us/um/redmond/projects/asirra/

  9. @ n0n3: grazie per il tuo commento! Riguardo Google e il display:none personalmente credo che non sia così matematica la penalizzazione.

  10. @ n0n3:
    Come detto da Doz, la penalizzazione non avviene assolutamente per display:none o campi hidden vari. L’importante è non mettervi dentro porzioni di testo abbondante, chiavi di ricerca e link.

  11. Ciao

    Grazie per la dritta anche se arrivo con qualche anno di ritardo…

    Quando dici: al posto di un campo testo vuoto si può scriverci una parola di sicurezza, che se cambiata invalida il form.

    devo mettere una parola nel campo value tipo “ciao” così ?

    e poi quale codice devo mettere per far si che se non c’è scritto ciao allora il form non è valido?

    Grazie e scusate l’ignoranza in materia…

  12. Grazie per la tua risposta ma essendo proprio ignorante in materia non sono sicura neanche delle cose più basilari…
    è corretto così?

    if ($antispam != 'ciao') { die("errore antispam"); }

    Inoltre volevo dirti che usando questo trucco del campo vuoto mi è arrivato lo stesso lo spam anche se molto meno.
    Con la parola di sicurezza è possibile che on mi arrivi del tutto?

    Grazie ancora!!

    1. eehh… sei sei proprio alle basi mi spiace ma non posso insegnarti tutto! Comunque quello che hai scritto è giusto.
      Lo spam continua ad arrivarti perchè probabilmente ormai il tuo indirizzo email è registrato negli archivi degli spammers, oppure anche perchè sarà scritto da qualche altra parte… i motivi possono essere vari. CIAO

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Ricevi un avviso se ci sono nuovi commenti. Oppure iscriviti senza commentare.

You can add images to your comment by clicking here.