Utiliser reCAPTCHA avec FormMail

Important: La version 1.0 de l'API reCAPTCHA n'est plus compatible. Veuillez passer à la version 2.0. En savoir plus

Nous allons vous expliquer comment ajouter reCAPTCHA à votre script FormMail sans utiliser le module Perl reCAPTCHA. Si vous savez ce que vous faites, vous pouvez également utiliser le module Perl de reCAPTCHA.

Côté client (comment faire apparaître l'image CAPTCHA)

Dans votre page HTML, dans l'élément <form>, vous devez ajouter le code suivant:

  <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>

Cela va probablement de soi, mais nous le dirons quand même: vous devez remplacer les deux instances de your_public_key par la clé publique que vous avez reçue lors du processus de création du compte. Veillez à ne pas utiliser votre clé privée par erreur.

Cette opération ajoute deux paramètres, qui sont transmis à formmail.cgi (ou FormMail.pl) via une requête POST, à savoir:

  • recaptcha_challenge_field: il s'agit du défi créé via votre clé publique.
  • recaptcha_response_field: il s'agit de la réponse envoyée par l'utilisateur à la question d'authentification ci-dessus.
  • Côté serveur (comment vérifier si l'utilisateur a saisi la bonne réponse)

    Vous devez ensuite modifier formmail.cgi (ou FormMail.pl) pour gérer les deux paramètres et valider la question d'authentification à partir des serveurs reCAPTCHA. À ce stade, il est probablement judicieux de créer une copie de sauvegarde de votre fichier FormMail.pl, au cas où. Dans le code ci-dessous, "+" signifie que la ligne doit être ajoutée au script FormMail et "-" signifie que la ligne doit être supprimée. Dans tous les cas, nous indiquons où les lignes doivent être ajoutées ou supprimées en affichant les lignes adjacentes dans le script FormMail.

    Tout d'abord, vous devez indiquer à Perl d'utiliser le module LWP::UserAgent en ajoutant la ligne suivante à FormMail:

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

    (Le module LWP::UserAgent doit se trouver dans votre environnement Perl. La plupart des installations de Perl comportent déjà ce module. Si le module n'est pas installé, voici quelques instructions de base pour l'installation des modules Perl.)

    Ajoutez ensuite du code pour appeler la fonctionnalité de vérification CAPTCHA définie ci-dessous.

     # 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;
    

    À présent, validez la réponse CAPTCHA et générez une erreur si la réponse ne correspond pas au défi.

     +##############################################################################
     +# 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.                                                   #
    

    Enfin, créez la fonctionnalité qui affiche le message d'erreur en cas d'échec de la vérification:

             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;
     }
    

    Et voilà ! reCAPTCHA devrait maintenant fonctionner sur votre site.

    Documentation complémentaire

  • Personnalisation de l'apparence
  • Conseils et consignes
  • Dépannage