PHP Kontaktformular mit Google reCaptcha Spamschutz
Inhaltsverzeichnis:
- Einleitung - reCaptcha - Beispiel - Erstellung - Einbindung - Auswertung (PHP) - Code Beispiel ohne JavaScript - Code Beispiel (Download)
Inhalt wurde mit PHP 8.2 & 7.2 geprüft
EinleitungBei 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. reCaptchaWas 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 SpamschutzErstellungUm 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). Danach kann schon mit dem Einbinden des Codes in die eigene Website begonnen werden. EinbindungHierzu 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). 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.Achtung!
Der verwendete Server oder Hostinganbieter muss für die Auswertung PHP unterstützen.
Code Beispiel ohne JavascriptSoll 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 SpamschutzGebrauchshinweise:
Download
formular_example.zip
Enthaltene Dateien:
letztes Update 11. August 2016
Kommentare
Hier können sowohl Fragen wie auch ein Feedback zum oben stehenden Artikel eingetragen werden.
Freut uns sehr das wir mit dem Tutorial helfen konnten und es bei dir dann schlussendlich dann auch noch funktioniert hat.
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
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();
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.
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.
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.
Hinweis: Der Eintrag wird nach einer redaktionellen Prüfung in den kommenden Tagen freigeschalten. |
Top ThemenSuche
DoubleTwist
iTunes mit Android Handy synchronisieren
Free YouTube Video Music
gratis Musik für Youtube Videos
Anzeige
Spenden
ROG Innovation unterstützen |