reCAPTCHA in PHP verwenden

Spam kann äußerst nervig sein und reCAPTCHA von Google ist ein äußerst mächtiges Werkzeug, wenn es darum geht diesen zu verhindern. Aber nicht nur hier ist reCAPTCHA recht praktisch, sondern kann auch genutzt werden um Anwender von Bots zu unterscheiden. Das Anwendungsgebiet dieses Captchas ist groß, in diesem Fall will ich mich aber darauf konzentrieren ein Kontaktformular in PHP mit reCAPTCHA gegen unerwünschten Spam abzusichern. Dieses Prinzip kann natürlich ebenso gut auf Kommentarbereiche oder generell Formulare angewandt werden.

Bevor es allerdings losgehen kann mit der Implementierung, muss man sich für die reCAPTCHA API bei Google registrieren. Hierfür reicht ein Google Account und anschließend kann man auf dieser Seite seine eigenen Domains für reCAPTCHA einrichten. Testweise mache ich dies für diese Domain.

Nach der erfolgreichen Registrierung erhält man Tipps zur Implementierung, als auch die beiden wichtigsten Dinge: Den Site key und den Secret key.

Mit diesen Informationen können wir nun beginnen das Captcha in ein Formular einzubauen. Als Beispiel nehmen wir dieses simple Kontaktformular:

<h2>Kontakt</h2>
 
<form method="post" action="kontakt.php">
  <input type="text" name="name" value="" /> Name <br>
  <input type="text" name="email" value="" /> E-Mail <br>
  <textarea type="text" name="nachricht"></textarea> <br>
  <input type="submit" name="senden" value="Absenden">
</form>

Das entsprechende PHP zum Auswerten sieht folgendermaßen aus:

<?php
if (isset($_POST['senden']) && !empty($POST['senden'])) {
  $name = $_POST['name'];
  $email = $_POST['email'];
  $nachricht = $_POST['nachricht'];
 
  mail("mail@example.org", "Nachricht von $name", $nachricht, "From: $email");
}
?>

In dem aktuellen Zustand ist dieses Formular natürlich gefundenes Fressen für allerlei Bots und Spamprogrammen. Es gibt viele Wege dies nun sicherer zu machen und diese Form der Verarbeitung der eingesandten Daten ist definitiv nicht die beste. Als Beispiel soll es aber reichen. Zum Einbinden des Captcha editieren wir als erstes das Formular. Hierfür brauchen wir nun auch den Site key. Neu hinzu kommt der folgende Code:

  <script src='https://www.google.com/recaptcha/api.js'></script>

Das JavaScript sollte vor dem abschließenden </head> im HTML-Code platziert werden. Falls man es vorzieht JavaScript erst im Footer-Bereich zu laden, kann es natürlich auch dort hin.

  <div class="g-recaptcha" data-sitekey="6LcrcREUAAAAAPjbbvLl3ggtAwc-QDcHo2KubDyf"></div>

Dieses HTML-Snippet ist dafür zuständig das Captcha anzuzeigen und gehört noch mit in den Formularbereich. Also vor das abschließende </form>

<form method="post" action="kontakt.php">
  <input type="text" name="name" value="" /> Name <br>
  <input type="text" name="email" value="" /> E-Mail <br>
  <textarea type="text" name="nachricht"></textarea> <br>
  <input type="submit" name="senden" value="Absenden">
  <div class="g-recaptcha" data-sitekey="6LcrcREUAAAAAPjbbvLl3ggtAwc-QDcHo2KubDyf"></div>
</form>

Bei der Auswertung der Formulardaten, muss nun zusätzlich noch das Captcha ausgewertet werden. Hierfür ist es nötig Daten an Google zu übermitteln und diese auszuwerten. Google liefert uns Daten im JSON-Format als Antwort zurück, welche wir dann daraufhin untersuchen können, ob das Captcha erfolgreich gelöst wurde. Für diesen Zweck haben wir zu beginn auch den Secret key erhalten. Unser PHP-Code wird um folgende Zeilen erweitert:

<?php
$secretkey = '6LcrcREUAAAAAB5x5A3_Cr1WbNNQeE_gimGqfQat';
 
$antwortJSON = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretkey.'&response='.$_POST['g-recaptcha-response']);
$antwortDaten = json_decode($antwortJSON);
 
if($antwortDaten->success){
  //Captcha erfolgreich gelöst
}
?>

Dieses Snippet müssen wir nun natürlich noch in unsere eigentliche Auswertung einpflegen. Hier macht es Sinn den Versand der E-Mail von der erfolgreichen Lösung des Captcha abhängig zu machen.

<?php
if (isset($_POST['senden']) && !empty($POST['senden'])) {
  $name = $_POST['name'];
  $email = $_POST['email'];
  $nachricht = $_POST['nachricht'];
  $secretkey = '6LcrcREUAAAAAB5x5A3_Cr1WbNNQeE_gimGqfQat';
 
  $antwortJSON = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretkey.'&response='.$_POST['g-recaptcha-response']);
  $antwortDaten = json_decode($antwortJSON);
 
  if($antwortDaten->success){
    mail("mail@example.org", "Nachricht von $name", $nachricht, "From: $email");
  }
}
?>

Nun wird die E-Mail nur Versand, wenn das Captcha erfolgreich gelöst und das Kontaktformular somit (hoffentlich) von einem Menschen ausgefüllt wurde. Damit ist die Einbindung des Captcha bereits abgeschlossen. Natürlich spiegelt dieses Kontaktformular und vor allem die Auswertung nicht die Realität wieder. Als Grundlagenbeispiel zum Einbinden des Captcha und um das Prinzip dahinter zu verdeutlichen, ist es aber ausreichend.