Für die Einbindung einer Captcha Lösung in die eigene Webseite gibt es unterschiedliche Lösungen. Ich möchte die von Google bereitgestellte Catcha- Lösung reCaptcha vorstellen.
Bevor die ganze Einbindung in die Webseite gestartet werden kann, muss man sich zunächst für den reCaptcha Service registrieren. Nach der Registrierung werden die gewünschten Domains (Bsp. mydomain.com, mydomain.de) und Subdomains (Bsp. login.mydomain.de) angeben. Im Anschluss wird für die angegebenen Domains ein privater und öffentlicher Schlüssel generiert.
Der öffentliche Schüssel (public Key) wird auf der Webseite eingebunden, wobei der private Schlüssel (private key) zur "Entschlüsselung" im Backend (Webserver) verwendet wird. Dazu gleich mehr und auch ein Beispiel.
Die benötigten Scriptblöcke sind hier im Beispiel <Fett> markiert dargestellt.
<html>
<head>
<title>Testpage Captcha</title>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body>
<form action="awresult.php" method="POST">
<div class="g-recaptcha" data-sitekey="<public key>"></div>
<br/>
<input type="text" name="input">
<input type="submit" value="Submit">
</form>
</body>
</html>
Auf der Serverseite muss dann innerhalb der Webseite (hier PHP) awresult.php z.B. über die REST API (CURL) die Auswertung und Überprüfung der korrekten Eingabe vorgenommen werden. Hierfür kommt der private key zum Einsatz.
Die von Google benötigten Werte müssen aus dem Request ausgelesen werden und als Parameter an den folgenden URL Aufruf angehängt werden.
https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address
awresult.php
<?php
//echo $_POST['g-recaptcha-response'];
//URL für Aufruf der REST-API
$method = 'GET';
$url = 'https://www.google.com/recaptcha/api/siteverify';
$params = array(
'secret' => '<privatekey>',
'response' => $_POST['g-recaptcha-response']
);
.....usw.....
Als Response liefert die API folgendes JSON Objekt zurück, welches nur noch ausgewertet werden muss.
{
"success":true|false,
"error-codes":[...] // optional
}