Proteggere i nostri form per invio di email o commenti è vitale soprattuto se il signor Google ha la nostro sito nella sua SERP in una posizione rilevante, questo non tanto perchè i nostri utenti fanno spam ma per proteggerci da quello che oggi è diventato un lavoro: lo spammer.
Esiste un fantastico servizio gratuito reCAPTCHA che ci mette a disposizione un sistema di protezione per i nostri form, consiste nella visualizzazione di una Captha (dei semplici caratteri da digitare che verificano se l'utente è umano o meno).
Vediamo come configurare la nostra captcha con ruby on rails.
Prima di tutto dobbiamo creare un account su recaptcha.net e inserire il nome del nostro dominio in modo che ci venga generate una chiave pubblica e una privata usate per criptare i dati che verranno inviati a recaptcha.net.
Secondo, installiamo un plugin per integrare il servizio offerto con la nostra applicazione rails.
$ ./script/plugin install git://github.com/ambethia/recaptcha.git
Terzo, dobbiamo piazzare in un posto sicuro le chiavi pubbliche e private, io le ho inserite alla fine del file development.rb, quando spostate l'applicazione nel vostro ambiente di produzione fatte la stessa cosa in prodution.rb.
ENV['RECAPTCHA_PUBLIC_KEY'] = 'MY_PUBLIC_KEY' ENV['RECAPTCHA_PRIVATE_KEY'] = 'MY_PRIVATE_KEY'
sostitite MY_PUBLIC_KEY e MY_PRIVATE_KEY con le chiavi fornite dal servizio.
Ora non ci resta che mostrare nella view il box reCAPTCHA. Aggiungete qualcosa di simile:
<p> <b>Verifico che tu sia umano</b> (campo obbligatorio) <%= recaptcha_tags %> </p>
Ogni pagina con il codice sopra riportato andrà ad interrogare le reCAPTCHA API e genererà una nuova captcha
Ci resta da verificare che la captcha inserita corrisponda a quella digitata dall'utente. Nei vostri controller basterà chiamare il metodo verify_recaptcha()
def send_mail @address = params[:email][:address] @isAddress = @address.match(EmailAddress).nil? if(!@isAddress & !@body.empty? & verify_recaptcha()) Emailer.deliver_contact_email(params[:email]) end end
Il metodo verify_recaptcha() legge i parametri dalla richiesta POST, chiama recaptcha.net a poi ritorna true o false a secondo dei caratteri inseriti nella captcha dall'utente.
Ringrazio vivamente chi ha sviluppato il plugin, ho impiegato più tempo a scrivere il post che a installarlo e farlo funzionare :)