Utilizzo di reCAPTCHA con FormMail

Importante: la versione 1.0 dell'API reCAPTCHA non è più supportata. Esegui l'upgrade alla versione 2.0. Scopri di più

Qui spiegheremo come aggiungere reCAPTCHA allo script FormMail senza utilizzare il Modulo reCAPTCHA Perl. Se sai cosa stai facendo, puoi utilizzare in alternativa il servizio reCAPTCHA Modulo Perl.

Lato client (come visualizzare l'immagine CAPTCHA)

Nella tua pagina HTML, all'interno del tag <form> devi aggiungere il seguente codice:

  <script type="text/javascript"
    src="http://www.google.com/recaptcha/api/challenge?k=your_public_key">
  </script>
  <noscript>
    <iframe src="http://www.google.com/recaptcha/api/noscript?k=your_public_key"
        height="300" width="500" frameborder="0"></iframe>

    <textarea name="recaptcha_challenge_field" rows="3" cols="40">
    </textarea>
    <input type="hidden" name="recaptcha_response_field"
        value="manual_challenge">
  </noscript>

Probabilmente va da sé, ma lo ribadiamo comunque: dovrete sostituire i due istanze di your_public_key con la chiave pubblica che hai ricevuto durante la procedura di creazione dell'account. Fai attenzione a non utilizzare le tue informazioni per errore.

In pratica, verranno aggiunti due parametri, che vengono trasmessi a formmail.cgi (o FormMail.pl) tramite una richiesta POST, ovvero:

  • recaptcha_challenge_field: questa è la sfida creata tramite il pubblico chiave.
  • recaptcha_response_field: questa è la risposta inviata dall'utente alla verifica di cui sopra.
  • Lato server (come verificare se l'utente ha inserito la risposta giusta)

    Successivamente, devi modificare formmail.cgi (o FormMail.pl) per gestire i due parametri e convalidare la verifica dai server reCAPTCHA. A questo punto, probabilmente è una buona idea crea una copia di backup del file FormMail.pl, per sicurezza. Nel codice riportato di seguito, "+" indica la linea deve essere aggiunto allo script FormMail e "-" significa che la linea deve essere rimossa da quest'ultima. In ogni caso, mostriamo dove devono essere aggiunte o rimosse le linee, mostrando le nello script FormMail.

    Innanzitutto, devi comunicare a Perl di usare il modulo LWP::UserAgent aggiungendo la seguente riga a FormMail:

     # ACCESS CONTROL FIX: Peter D. Thompson Yezek                                #
     #                     http://www.securityfocus.com/archive/1/62033           #
     ##############################################################################
     +use LWP::UserAgent;
     +
    

    Sarà necessario il modulo LWP::UserAgent nel tuo ambiente Perl. La maggior parte delle installazioni di Perl dispone già di questo modulo. Nel caso il modulo non è installato, ecco alcune istruzioni di base sull'installazione di Perl moduli.)

    Quindi, aggiungi il codice per richiamare la funzionalità di controllo CAPTCHA definita di seguito.

     # Check Required Fields
     &check_required;
    
     +# Check the captcha challenge and response.
     +&check_captcha;
     +
     # Send E-Mail
     &send_mail;
    
     # Return HTML Page or Redirect User
     &return_html;
    

    Ora convalida la risposta CAPTCHA e genera un errore se la risposta non corrisponde sfida.

     +##############################################################################
     +# Check the CAPTCHA response via the reCAPTCHA service.
     +sub check_captcha {
     +
     +      my $ua = LWP::UserAgent->new();
     +      my $result=$ua->post(
     +      'https://www.google.com/recaptcha/api/verify',
     +      {
     +          privatekey => 'your_private_key',
     +          remoteip   => $ENV{'REMOTE_ADDR'},
     +          challenge  => $Form{'recaptcha_challenge_field'},
     +          response   => $Form{'recaptcha_response_field'}
     +      });
     +
     +      if ( $result->is_success && $result->content =~ /^true/) {
     +              return;
     +      } else {
     +              &error('captcha_failed');
     +      }
     +}
     +
     # NOTE rev1.91: This function is no longer intended to stop abuse, that      #
     #    functionality is now embedded in the checks made on @recipients and the #
     #    recipient form field.                                                   #
    

    Infine, crea la funzionalità che stampa il messaggio di errore nel caso in cui il controllo non riesce:

             if ($Config{'missing_fields_redirect'}) {
                 print "Location: " . &clean_html($Config{'missing_fields_redirect'}) . "\n\n";
             }
     +    }
     +    elsif ($error eq 'captcha_failed') {
     +            print <<"(END ERROR HTML)";
     +Content-type: text/html
     +
     +<html>
     + <head>
     +  <title>Error: Captcha Check Failed</title>
     + </head>
     + <body bgcolor=#FFFFFF text=#000000>
     + <center>
     +  <table border=0 width=600 bgcolor=#9C9C9C>
     +    <tr><th><font size=+2>Error: Captcha Check Failed</font></th></tr%gt;
     +   </table>
     +  <table border=0 width=600 bgcolor=#CFCFCF>
     +    <tr><td>The Captcha response of the form you submitted did not match the challenge.
     +     Please check the form and make sure that your response matches the challenge in the captcha image.
     +     You can use the browser back button to return to the form.
     +     </center%gt;
     +    </td></tr>
     +   </table>
     +  </center>
     + </body>
     +</html>
     +(END ERROR HTML)
     +    }
             else {
                  foreach $missing_field (@error_fields) {
                      $missing_field_list .= "<li>" . &clean_html($missing_field) . "\n";
     .
     .
     .
      </html>
     (END ERROR HTML)
             }
     -    }
     -
         exit;
     }
    

    È tutto. reCAPTCHA dovrebbe funzionare sul tuo sito.

    Per approfondire

  • Personalizzazione di aspetto e design
  • Suggerimenti e linee guida
  • Risoluzione dei problemi