Kategorien
Tutorials

Google reCAPTCHA Formularvalidierung

Mit einem reCAPTCHA von Google ist es sehr einfach zu prüfen, ob ein Bot (Script, etc.) das Formular versucht abzusenden, oder ein Mensch.

Zuerst müssen die Schlüssel über die Admin-Console von Google generiert werden.

https://www.google.com/recaptcha/admin/

In diesem Artikel wird die Nutzung von der Version 2 beschrieben. 

Anschließend gibt man die URL der zu sichernden Seite an und bestätigt die Nutzungsbedingungen.

Als nächstes erhält man zwei Schlüssel. Der erste ist für das Frontend bzw. kann im Klartext im Quelltext der Seite stehen. Der zweite dient zur Validierung über den Server. In diesem Beispiel mit Hilfe von PHP.

Das HTML-Formular kann dann wie folgt aussehen:

    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    <script>
        function enableBtn() {
            document.getElementById("submit").disabled = false;
            document.getElementById("submit").style.display = "block";
        }
    </script>

<form>
<div class="g-recaptcha" data-sitekey="SCHLÜSSEL1" data-callback="enableBtn"></div>
<input type="submit" value="Absenden" id="submit" disabled="disabled" style="display:none;">
</form>

In diesem Beispiel bleibt die Absendeschaltfläche bis zum Lösen des Captchas versteckt.

Um die Validierung auf dem Server durchzuführen, muss eine POST Anfrage an Google gesendet werden. Hier ein Beispiel mit Guzzle:

    $client = new GuzzleHttp\Client([
        'base_uri' => 'https://www.google.com',
        'timeout' => 600,
    ]);

    try {
        $res = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => SCHLÜSSEL2,
                'response' => $_POST['g-recaptcha-response'],
            ]
        ]);
    }

Als Antwort gibt Google bei einem gelösten Captcha als JSON den boolschen Wert „success“ zurück.

Dieses Beispiel dient nur zur veranschaulichung der Einbindung von Google reCAPTCHA. Das Formular muss natürlich noch entsprechend gegen XSS etc. abgesichert werden!