reCAPTCHA mit FormMail verwenden

Wichtig: Version 1.0 der reCAPTCHA API wird nicht mehr unterstützt. Führen Sie ein Upgrade auf Version 2.0 aus. Weitere Informationen

Hier erfahren Sie, wie Sie reCAPTCHA in Ihr FormMail-Skript einfügen, ohne das reCAPTCHA Perl-Modul zu verwenden. Wenn Sie wissen, was Sie tun, können Sie alternativ das reCAPTCHA Perl-Modul verwenden.

Clientseitig (So wird das CAPTCHA-Bild angezeigt)

Fügen Sie auf Ihrer HTML-Seite innerhalb des <form>-Elements den folgenden Code ein:

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

Selbstverständlich sagen wir es trotzdem: Sie müssen die beiden Instanzen von your_public_key durch den öffentlichen Schlüssel ersetzen, den Sie bei der Kontoerstellung erhalten haben. Achten Sie darauf, dass Sie Ihren privaten Schlüssel nicht versehentlich verwenden.

Dadurch werden im Grunde zwei Parameter hinzugefügt, die über eine POST-Anfrage an formmail.cgi (oder FormMail.pl) übergeben werden:

  • recaptcha_challenge_field: Die mit Ihrem öffentlichen Schlüssel erstellte Aufgabe.
  • recaptcha_response_field: Dies ist die vom Nutzer gesendete Antwort auf die obige Aufgabe.
  • Serverseitig (So testen Sie, ob der Nutzer die richtige Antwort eingegeben hat)

    Als Nächstes müssen Sie formmail.cgi (oder FormMail.pl) so ändern, dass die beiden Parameter verarbeitet und die Abfrage von den reCAPTCHA-Servern validiert wird. An dieser Stelle empfiehlt es sich, sicherheitshalber eine Sicherungskopie von FormMail.pl zu erstellen. Im folgenden Code bedeutet „+“, dass die Zeile dem FormMail-Skript hinzugefügt werden muss, und „-“ bedeutet, dass die Zeile entfernt werden muss. In jedem Fall zeigen wir durch die angrenzenden Zeilen im FormMail-Skript, wo die Zeilen hinzugefügt oder entfernt werden müssen.

    Zuerst müssen Sie Perl anweisen, das Modul LWP::UserAgent zu verwenden, indem Sie die folgende Zeile in FormMail hinzufügen:

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

    Dazu muss sich das Modul LWP::UserAgent in Ihrer Perl-Umgebung befinden. Die meisten Perl-Installationen verfügen bereits über dieses Modul. Falls das Modul nicht installiert ist, finden Sie hier einige grundlegende Anweisungen zur Installation von Perl-Modulen.

    Fügen Sie dann Code hinzu, um die unten beschriebene CAPTCHA-Überprüfungsfunktion aufzurufen.

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

    Validieren Sie nun die CAPTCHA-Antwort und generieren Sie einen Fehler, wenn die Antwort nicht der Herausforderung entspricht.

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

    Erstellen Sie abschließend die Funktion, mit der die Fehlermeldung für den Fall ausgegeben wird, dass die Prüfung fehlschlägt:

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

    reCAPTCHA sollte nun auf Ihrer Website funktionieren.

    Weiterführende Literatur

  • Erscheinungsbild anpassen
  • Tipps und Richtlinien
  • Fehlerbehebung