ROG Innovation Logo

Tutorials, Gadgets und vieles mehr - Idea. Creation. Success. - Let's create the future!

PHP Kontaktformular mit Google reCaptcha Spamschutz

PHP Kontaktformular mit Google reCaptcha Spamschutz

Inhaltsverzeichnis:
  - Einleitung
  - reCaptcha
  - Beispiel
  - Erstellung
  - Einbindung
  - Auswertung (PHP)
  - Code Beispiel ohne JavaScript
  - Code Beispiel (Download)

info Inhalt wurde mit PHP 8.2 & 7.2 geprüft 

Einleitung

Bei vielen Websiten soll dem Websitebesucher die Kontakktaufnahme mit dem Websitebetreiber durch ein auf der Website eingebautes Kontakktformular erleichtert werden.
Im diesem Tutorial wird Schritt für Schritt erklärt wie ein solches Kontaktformular auf der eigenen Website erstellt werden kann.
Wir haben uns für die PHP Varriante mit dem Spamschutz vom Google reCaptcha entschieden, da zum einen gratis ist und zum anderen für ein einfaches Kontaktformular sehr geeignet ist.
Für eine einwandfreie Funktione dieses Kontakktformular muss auf dem Websiteserver mind. die PHP Version 7.0 installiert sein.

reCaptcha

Was ist überhaupt Google reCaptcha? reCaptcha von Google ist ein gratis Captcha-Dienst und kann in die eigene Website z.B. als Formular Spamschutz eingebunden und verwendet werden.
Die Aufgabe von reCaptcha besteht darin, bestimmte Handlung im Internet von einem Menschen zu einem Bot (Roboter oder automatisierter Spamserver) zu unterscheiden.
Somit kann sichergestellt werden, dass z.B. ein Kontaktfkormular wirklich von einem Menschen ausgefüllt wurde und nicht von einem Bot mit Spam zugemüllt wurde.

Kontaktformular Beispiel mit reCHAPTCHA, Version 2 Spamschutz


Name


e-Mail


Nachricht






Erstellung

Um die reCaptcha Funktion zu nutzen einfach auf Google reCaptcha mit seinem Google Account einloggen.
Nun kann die Website oder auch mehrere Websites festgelegt werden, welche den reCaptcha Code danach zur Spamverhinderung verwenden können (allfällige Unterdomänen werden ebenfalls automatisch berechtigt).

PHP Kontaktformular mit Google reCaptcha Spamschutz

Danach kann schon mit dem Einbinden des Codes in die eigene Website begonnen werden.

Einbindung

Hierzu wird die Formularseite 'formular.html' oder 'formular.php' erstellt.

HTML Code
<html>
<head>
<title>PHP Kontaktformular mit Google reCAPTCHA Spamschutz</title>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body>
  <h1>PHP Kontaktformular mit Google reCAPTCHA Spamschutz</h1>
  <!-- Fallback bei dektiviertem JavaScript im Browser -->
  <noscript>
    <span style="color: red;">Bitte JavaScript im Browser aktivieren!</span>
  </noscript>
  <form id="comment_form" action="auswertung.php" method="post">
    Name<br>
    <input type="text" name="name" required="required" placeholder="Name Bitte hier eingeben" size="40"><br><br>
    e-Mail<br>
    <input type="email" name="email" required="required" placeholder="e-Mail bitte hier eingeben" size="40"><br><br>
    Nachricht<br>
    <textarea name="comment" placeholder="Nachricht bitte hier eingeben" required="required" rows="8" cols="39"></textarea><br><br>
    <div class="g-recaptcha" data-sitekey="*---WEBSITESCHLÜSSEL---"></div><br>
    <input type="submit" name="submit" value="Senden"><br><br>
  </form>
</body>
</html>

*---WEBSITESCHLÜSSEL--- Muss durch den eigenen Google reCaptcha-Websitschlüssel ersetzt werden.
Den Website Schlüssel befindet Sich im reCaptcha Menu unter dem Punkt 'Schritt 1: Clientseitige Integration' (auf klicken).

PHP Kontaktformular mit Google reCaptcha Spamschutz in Website einbinden

PHP Kontaktformular mit Google reCaptcha Spamschutz einrichten

Genauere Informationen zur Benutzung des reCAPTCHA von Google sind hier zu finden: Google Developers reCAPTCHA.

Achtung!
reCaptcha funktioniert nur wenn JavaScript im Browser nicht deaktiviert wurde.

Auswertung (PHP)

Kommen wir zur Auswertung. Natürlich müssen wir das Ergebniss von Google reCapptcha auslesen, damit wir zwischen Spam oder eben nicht Spam unterscheiden können.
Hierfür wird der Rückgabewert der Variabel 'g-recaptcha-response' mit der Kombination von unserem geheimen Schlüssel (Secret Key) verwendet und an eine PHP-Seite zur Auswertung weitergeleitet (in unserem Beispiel: 'auswertung.php').

PHP Code
<?php
// Variabeln
$name;
$email;
$comment;
$captcha;
// Variabeln mit Inhalt aus dem Formular befüllen
if(isset($_POST['name'])){$name=$_POST['name'];}
else {$name ="";}

if(isset($_POST['comment'])){$comment=$_POST['comment'];}
else {$comment ="";}

if(isset($_POST['email'])){$email=$_POST['email'];}
else {$email ="";}

if(isset($_POST['g-recaptcha-response'])){$captcha=$_POST['g-recaptcha-response'];}
else {$captcha ="";}

// Google reCaptcha Box wurde nicht angehakt
if(!$captcha){
  echo 'Bitte Google reCaptcha Checkbox aktivieren.
    <a style="display: block;" title="back" href="javascript:history.back(-1)">
      <button style="font-size: 1.2em;" type="button" name="erneut versuchen">erneut versuchen</button>
    </a>';
  exit;}

// Spamversuch wird geblockt, es wird keine eMail versendet
$secretKey = "*---SECRET KEY---";
$ip = $_SERVER['REMOTE_ADDR'];
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha."&remoteip=".$ip);
$responseKeys = json_decode($response,true);
if(intval($responseKeys["success"]) !== 1) {
  echo 'Spamversuch!<br>Sorry die Nachricht wurde als Spam ausgewertet und somit nicht versendet.';}
else {
  // Zeitzone setzen
  $timezone = 'Europe/Berlin';
  date_default_timezone_set($timezone);
  
  // eMail Parameter
  $empfaenger = "*mail@deinedomaine.com";
  $betreff = "PHP Kontaktformular mit Google reCAPTCHA Spamschutz ".date("d.m.Y - H:i");
  $emailnachricht = "Name: ".$name."\r\ne-Mail: ".$email."\r\n\r\nNachricht: \r\n".$comment;
  $header = "From: kontaktformular <*mail@deinedomaine.com>";
  // eMail versenden
  mail($empfaenger, $betreff, $emailnachricht, $header);
  echo 'Besten Danke<br>Die Daten wurden erfolgreich übermittelt.';}
?>

*---SECRET KEY--- Muss durch den eigenen Google reCaptcha-Secret Key ersetzt werden.
Dieser Secret Key befindet sich im reCaptcha Menu unter dem Punkt 'Schritt 2: Serverseitige Integration' (aufklappen).
*mail@deinedomaine.com durch eine gültige eMail-Adresse vom Website-Server ersetzen.

PHP Kontaktformular mit Google reCaptcha Spamschutz tutorial

Achtung!
Der verwendete Server oder Hostinganbieter muss für die Auswertung PHP unterstützen.

Code Beispiel ohne Javascript

Soll reCAPTCHA auch von Besuchern welche JavaScript im Browser deaktiviert haben verwendet werden können muss das obige Code Beispiel mit untenstehenden Code Zeilen ergänzt werden.

Codebeispiel ohne JavaScript
<noscript>
  <div style="width: 302px; height: 422px;">
    <div style="width: 302px; height: 422px; position: relative;">
      <div style="width: 302px; height: 422px; position: absolute;">
      <iframe src="https://www.google.com/recaptcha/api/fallback?k=your_site_key"
      frameborder="0" scrolling="no"
      style="width: 302px; height:422px; border-style: none;">
      </iframe>
    </div>
    <div style="width: 300px; height: 60px; border-style: none;
      bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px;
      background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
      <textarea id="g-recaptcha-response" name="g-recaptcha-response"
        class="g-recaptcha-response"
        style="width: 250px; height: 40px; border: 1px solid #c1c1c1;
        margin: 10px 25px; padding: 0px; resize: none;" >
      </textarea>
    </div>
  </div>
  </div>
</noscript>

Kontaktformular Code Beispiel mit reCHAPTCHA Version 2 Spamschutz

Gebrauchshinweise:
  • In der Datei formular.php muss der "WEBSITESCHLÜSSEL" durch den eigenen "reCAPTCHA Schlüssel" ersetzt werden.
  • In der Datei auswertung.php muss der "GEHEIMER SCHLÜSSEL" durch den eigenen "Geheimer Schlüssel" ersetzt werden.

download Download
formular_example.zip


Enthaltene Dateien:
  • formular.php
  • auswertung.php



Kommentare
Hier können sowohl Fragen wie auch ein Feedback zum oben stehenden Artikel eingetragen werden.

ROG Innovation 06.07.2021 21:27
Hallo @Mirko, vielen Dank für Dein Feedback.
Freut uns sehr das wir mit dem Tutorial helfen konnten und es bei dir dann schlussendlich dann auch noch funktioniert hat.
Mirko 06.07.2021 19:31
Hallo, vielen Dank für diesen Lösungsweg, hat mir sehr geholfen 😊 👍
Ich hatte anfangs auf einer Seite das Problem, dass nach dem php-Befehl ";exit;" kein weiteres HTML interpretiert wurde und deshalb der fehlende Tag dazu geführt hat, immer wieder auf "erneut versuchen" zu verweisen. Jetzt funzt das prima.
Danke und Grüße, Mirko
Bernd 24.11.2020 22:55
Abschließend: Die korrekte Darstellung der Sonderzeichen ist Aufgabe der Software beim Endbenutzer. Ist also nicht mehr unsere Angelegenheit.
Noch ein Tipp: Wenn man in auswertung.php die Variable $header um reply-to ergänzt, erscheint im Mailprogramm des Empfängers an richtiger Stelle die Antwort-Adresse. Hier der Code: $header = 'From: kontaktformular <*mail@deinedomaine.com>'."\r\n". 'Reply-To: '.$email. "\r\n" . 'X-Mailer: PHP/' . phpversion();
ROG Innovation 20.11.2020 08:07
Hallo @Bernd, vielen Dank für das Durchführen der Tests und dein Feedback. Dann kann dir nun hoffentlich der Support deines Hoster dir weiterhelfen.
Bernd 19.11.2020 23:50
Danke für Deine Geduld. Der Code echo($comment); hat funktioniert. Daher habe ich nochmal die versteckten Servereinstellungen geprüft, da stand noch ISO-8859-1, eine Änderung auf UTF-8 hat das Problem soweit gelöst, daß die Formulareingaben bis zum Webmailclient des Hosters korrekt übermittelt werden. Ein normaler Mailclient wie "Mail für Windows 10" oder The Bat! stellt die Zeichen wieder kryptisch dar. Ich habe den Hoster um Support gebeten und schreibe hier wieder.
ROG Innovation 15.11.2020 21:48
@Bernd, den Array-Code kannst du leider nicht 1:1 übernehmen da die Variablen der beiden Tutorials von den beiden Seiten nicht aufeinander abgestimmt sind (andere Namen und anderer Aufbau). Es könnte sicher ein Ansatz sein. Überprüfe aber doch erst einmal, ob die Sonderzeichen und Umlaute vom Eingabeformular korrekt an die auswertung.php-Seite übergeben werden. Dies kannst du z.B. überprüfen in dem du echo($comment); vor "// Google reCaptcha Box wurde nicht angehakt" einfügst. Der Nachrichteninhalt (comment) sollte nun im Browser angezeigt werden).
Bernd 15.11.2020 20:56
Das scheint komplizierter zu sein, ein Eintrag im html-Header mit Charset-Deklarierung bewirkt nichts. Ich habe diese Seite gefunden: https://www.php-kurs.com/email-per-php.htm , weiß aber nicht, ob das mein Problem abdeckt und wo in der auswertung.php ich den Code (Array) eintragen kann. Ich hoffe, diese Fragerei von mir wird Dir nicht zu viel.
ROG Innovation 14.11.2020 23:55
Hallo @Bernd das Verhalten deutet auf eine falsche Codierung hin. Vermutlich wird die Übermittlung bei dir auf dem E-Mail Server von UTF-8 in ANSI umgewandelt oder die Codierung in deinem HTML-Dokument müsste angepasst werden.
Bernd 14.11.2020 20:46
.... aber ich habe doch noch einen Fehler gefunden bzw. vermisse etwas: Das Formular übermittelt keine deutschen Sonderzeichen, sondern stellt sie z.B. so dar "muß" wird zu "muß" "bestätigen" wird zu "bestätigen", usw. Läßt sich daran was durch anderen PHP-Code ändern?
Bernd 13.11.2020 23:06
Ja, ich habe die Mailadresse jetzt umgestellt auf eine innerhalb derselben Domain und es funktioniert. Vorher habe ich es mit einer gmail-Adresse getestet, das lief nicht. Danke für den Tip und die Scripts.
ROG Innovation 11.11.2020 09:01
Hallo @Bernd, befindest sich der E-Mailserver auf dem gleichen Hostserver und verwendest du die E-Mailadresse deiner Domäne oder verwendest du für das Versenden der E-Mail einen Fremdanbieter wie gmail?
Das Script funktioniert nur beim Verwenden von der eigenen Domäne E-Mailadresse aus (z.B. auf der Webseite muster.de kann nur von der E-Mail Adresse xxx@muster.de eine E-Mail abgesetzt werden). Das wurde seit einiger Zeit aus Sicherheitsgründen eingeschränkt, damit nicht von einer "gefälschten" E-Mail Adresse E-Mails versendet werden können.
Bernd 10.11.2020 20:38
Ich möchte die beiden Scripte auf einer privaten Website verwenden und habe sie testweise beim Webhoster auf einen Apache-Webserver mit PHP 7.0 (oder 7.0x) geladen und sie funktionieren bis zur Erfolgsmeldung 'Besten Danke Die Daten wurden erfolgreich übermittelt'. Aber es kommt keine eMail bei der in auswertung.php hinterlegten eMail-Adresse an. Wo ist der Fehler?
ROG Innovation 15.11.2019 13:19
Hallo @Markus
Welche PHP Version verwendest du?
Versuch mal statt if(intval($responseKeys["success"]) !== 1) alternativ if(intval($responseKeys["success"]) !== 0) und überprüfe aber ob nun Spamversuche noch geblockt werden. Es kann sein, dass sich nicht alle PHP-Versionen gleich verhalten.
Markus 15.11.2019 12:58
Das Forularskript sieht sehr gut aus. Ich erhalte jedoch immer die Meldung "Spamversuch! Sorry die Nachricht wurde als Spam ausgewertet und somit nicht versendet". wenn ich das Formular teste. Woran liegt das? Beste Grüsse Markus
ROG Innovation 13.11.2019 20:00
Hallo @Marcus
Vielen Dank für deine lobenden Worte.
Ja, dies funktioniert. Hierfür muss die URL auf die gleiche Seite weitergeleitet werden und der Code der Auswertungsseite ebenfalls auf derselben Seite eingebaut werden und z.B. über eine Variable in der URL per PHP ausgewertet werden, über das Setzen von Cookies oder über die Verwendung von JavaScript.
Marcus 07.11.2019 08:03
Super Formularskript und einfach zu integrieren. Gibt es eine Möglichkeit das Ergebnis der Auswertung (Echo) an die Seite mit dem Formularfeld zurückzugeben und nicht in einer neuen Seite darzustellen? Vielen Dank für eine kurze Hilfestellung. Beste Grüße Marcus

*Name:


*Kommentar:

(max. 500 Zeichen)

Terms:


*Pflichtfeld

Hinweis:
Der Eintrag wird nach einer redaktionellen Prüfung in den kommenden Tagen freigeschalten.

Top Themen

Suche
DoubleTwist
doubletwist iTunes mit Android Handy synchronisieren
Free YouTube Video Music
Youtube gratis Musik für Youtube Videos
Anzeige
Spenden
ROG Innovation unterstützen