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 Perl reCAPTCHA. Se sai cosa stai facendo, in alternativa puoi utilizzare il modulo reCAPTCHA Perl.

Lato client (come visualizzare l'immagine del CAPTCHA)

Nella pagina HTML, all'interno dell'elemento <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 è ovvio, ma lo diremo comunque: devi sostituire le due istanze di your_public_key con la chiave pubblica che hai ricevuto durante il processo di creazione dell'account. Fai attenzione a non utilizzare la tua chiave privata per errore.

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

  • recaptcha_challenge_field: questa è la sfida creata con la tua chiave pubblica.
  • recaptcha_response_field: questa è la risposta inviata dall'utente alla verifica precedente.
  • Lato server (come verificare se l'utente ha inserito la risposta corretta)

    Successivamente, devi modificare formmail.cgi (o FormMail.pl) per gestire i due parametri e convalidare la verifica dai server reCAPTCHA. A questo punto, potrebbe essere opportuno creare una copia di backup di FormMail.pl, per sicurezza. Nel codice seguente, "+" indica che la riga deve essere aggiunta allo script FormMail, mentre "-" significa che la riga deve essere rimossa. In ogni caso, mostriamo dove aggiungere o rimuovere le righe mostrando le righe adiacenti nello script FormMail.

    Innanzitutto, devi indicare a Perl di utilizzare 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;
     +
    

    (Ciò richiederà che il modulo LWP::UserAgent sia nel tuo ambiente Perl. La maggior parte delle installazioni di Perl dispone già di questo modulo. Nel caso in cui il modulo non sia installato, ecco alcune istruzioni di base sull'installazione dei moduli Perl.

    Quindi, aggiungi il codice per chiamare 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 alla verifica.

     +##############################################################################
     +# 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 vada a buon fine:

             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. Ora reCAPTCHA dovrebbe funzionare sul tuo sito.

    Per approfondire

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