reCAPTCHA v3 mit Html, JavaScript und PHP einbinden
Ein Google-reCAPTCHA erstellen
Die Admin Console öffnen
Ein neues Recaptcha kann man hier erstellen.
Das Label sollte gut wiedererkennbar sein. (z.B. Login Aha-Ha).
Als reCAPTCHA-Typ sollte Version 3 ausgewählt werden. Eine Demo zu Version 3 gibt es hier.
Nun die Domain eintragen. (z.B. für localhost: 127.0.0.1).
Die Nutzungsbedingungen müssen akzeptiert werden.
Nach dem Absenden bekommt man nun 2 Schlüssel: Einen Websiteschlüssel und einen Geheimen Schlüssel.
HTML und JavaScript
Das HTML-Formular mit JavaScript:
<form action="dieseseite.php" method="post">
<input type="text" name="name" id="name" placeholder="Vor- und Nachname"><br>
<input type="date" name="date" id="date" placeholder="Datum"><br>
<input type="time" name="time" id="time" placeholder="Uhrzeit"><br>
<input type="email" name="email" id="email" placeholder="E-Mail Adresse"><br>
<input type="hidden" name="token" id="token">
<button type="submit" name="check" id="checkbutton">Daten überprüfen...</button><br>
<button type="submit" name="submit" id="submit" disabled>Termin vereinbaren!</button>
</form>
<!-- Google JS-Api holen -->
<script src="https://www.google.com/recaptcha/api.js?render=Websiteschlüssel"></script>
<script>
document.getElementById("checkbutton").addEventListener('click', function(e){
console.log("click", e)
e.preventDefault();
grecaptcha.ready(()=>{
grecaptcha.execute('Websiteschlüssel', {action: 'submit'}).then(
(token)=>{
document.getElementById("token").value = token;
document.getElementById("submit").disabled = false;
document.getElementById("checkbutton").disabled = true;
});
});
})
document.getElementById("submit").addEventListener('click', console.log);
</script>
PHP
Bei diesem Formular muss “dieseseite.php” durch den Namen der aktuellen Website ersetzt werden.
if(isset($_POST["submit"])){
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverifysecret=Geheimschlüssel&response=".$_POST["token"]);
$request = json_decode($request);
$score = $request->score;
$timestamp = $request->challenge_ts;
Danach ist die Variable “$score” auf den Recaptcha-Score gesetzt. Also ein float zwischen 0.0 und 1.0.
Je niedriger die Zahl, umso größer ist die Warscheinlichkeit, dass ein Roboter das Formular abgesendet hat.
Die Variable “$timestamp” ist auf den Zeitstempel der Anfrage an Google gesetzt.
Das fertige Programm mit E-Mail-Benachrichtigung
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Termin vereinbaren | Café Treu | Araco</title>
</head>
<body>
<?php
if(isset($_POST["submit"])){
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=Geheimschlüssel&response=".$_POST["token"]);
$request = json_decode($request);
if ($request->score >= 0.6) {
mail("E-Mail@beispiel.de", "Neuer Termin", 'Name: '.$_POST["name"].' Email: '.$_POST["email"].' Datum: '.$_POST["date"].' Uhrzeit: '.$_POST["time"].' Score: '.$request->score.' Timestamp: '.$request->challenge_ts);
?>
<h1 style="color: green;">Das Terminformular wurde erfolgreich abgesendet!</h1>
<?php
}
}
?>
<form action="termin.php" method="post">
<input type="text" name="name" id="name" placeholder="Vor- und Nachname"><br>
<input type="date" name="date" id="date" placeholder="Datum"><br>
<input type="time" name="time" id="time" placeholder="Uhrzeit"><br>
<input type="email" name="email" id="email" placeholder="E-Mail Adresse"><br>
<input type="hidden" name="token" id="token">
<button type="submit" name="check" id="checkbutton">Daten überprüfen...</button><br>
<button type="submit" name="submit" id="submit" disabled>Termin vereinbaren!</button>
</form>
<!-- Google JS-Api holen -->
<script src="https://www.google.com/recaptcha/api.js?render=Websiteschlüssel"></script>
<script>
document.getElementById("checkbutton").addEventListener('click', function(e){
console.log("click", e)
e.preventDefault();
grecaptcha.ready(()=>{
grecaptcha.execute('Websiteschlüssel', {action: 'submit'}).then(
(token)=>{
document.getElementById("token").value = token;
document.getElementById("submit").disabled = false;
document.getElementById("checkbutton").disabled = true;
});
});
})
document.getElementById("submit").addEventListener('click', console.log);
</script>
</body>
</html>
Ergebnis
Das Ergebnis kommt in JSON-Format zurück:
{
"success": true,
"hostname": "127.0.0.1",
"challenge_ts": "2000-00-00T00:00:00Z",
"apk_package_name": null,
"score": 0.9,
"action": "examples/v3scores",
"error-codes": []
}
Vorteile
- Spam-Roboter werden keine Formulare absenden
Nachteile
- Google setzt auf der Website Cookies.