KODOPOL CAPTCHA
Zaloguj się

Instrukcja wdrożenia

Wdrożenie KODOPOL CAPTCHA wymaga implementacji dwóch podstawowych elementów:

  • Wywołanie popupu CAPTCHA na froncie
  • Weryfikacja zwrotki z CAPTCHA na backendzie

Wywołanie popupu CAPTCHA

Można skorzystać z naszego skryptu (wkleić go bezpośrednio do kodu strony) lub przygotować własną implementację. Skrypt można wygenerować w tym panelu w zakładce Generator. Dodatkowo na stronie, na której wklejamy skrypt, musimy zaimplementować formularz z inputem kodopol_captcha. Skrypt wpina się w taki formularz oraz przechwytuje próbę jego wysłania, wywołując popup z KODOPOL CAPTCHA. Po rozwiązaniu CAPTCHA przez użytkownika formularz jest wysyłany, a backend otrzymuje zwrotkę z danymi oraz polem kodopol_captcha.


<form method="POST">
    <input type="hidden" name="kodopol_captcha">
    <button>
        Wyślij
    </button>
</form>
<script>
    const input = document.querySelector('form input[name="kodopol_captcha"]');
    const form = input.closest('form');
    form.addEventListener('submit', (e) => {
        e.preventDefault();
        window.open(`https://captcha.kodopol.eu/captcha?org=captcha.kodopol.eu&own=captcha@kodopol.eu&ref=${location.origin}`, 'kodopol_captcha', 'width=500,height=700');
    })
    window.addEventListener('message', (event) => {
        const { kodopol_captcha } = event.data;
        input.value = kodopol_captcha;
        form.submit();
    });
</script>

Parametry zapytania do /captcha:

Parametr Nazwa Opis
org Domena Nazwa domeny aplikacji, która korzysta z CAPTCHA
own Właściciel Adres e-mail konta, które wygenerowało klucz prywatny
ref* Odpowiedź Adres strony, która wywołała popup CAPTCHA

Backend: weryfikacja zwrotki

Po wygenerowaniu klucza kodopol_captcha formularz zostaje przesłany do backendu. Tam możemy go przechwycić (w przypadku PHP) $_POST['kodopol_captcha'], a następnie przy pomocy biblioteki SIGIL zweryfikować autentyczność odpowiedzi:


if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $token = $_POST['kodopol_captcha'] ?? '';
    $check = sigil_check($token, "captcha@kodopol.eu|captcha.kodopol.eu", 'PRIVATE_KEY', 30);
    if ($check['ok']) {
        /** @TODO: */
    }
}

Zwrotka jest po prostu ciągiem znaków ADRES_EMAIL_WŁAŚCICIELA|DOMENA_APLIKACJI, sygnaturowanym SIGIL-em przy pomocy klucza prywatnego właściciela w przedziale czasowym 2×30 s. Bibliotekę SIGIL można znaleźć na stronie KODOPOL lub użyć poniższego kodu:


function sigil_hash (string $str, string $priv) : string
{
    return hash_hmac('sha512', $str, $priv);
}

function sigil_check (string $sigil, string $code, string $priv, int $time_frame) : array
{
    $current_time_frame = floor(time() / $time_frame);
    $hash = sigil_hash($code . '|' . $current_time_frame, $priv);

    if (hash_equals($sigil, $hash)) {
        return [
            'ok' => true,
            'expr' => false
        ];
    }

    $past_time_frame = floor((time() - $time_frame) / $time_frame);
    $hash2 = sigil_hash($code . '|' . $past_time_frame, $priv);
    if (hash_equals($sigil, $hash2)) {
        return [
            'ok' => true,
            'expr' => true,
            'rehash' => $hash
        ];
    }

    return [
        'ok' => false
    ];
}

function sigil_sign (string $code, string $priv, int $time_frame) : string
{
    $current_time_frame = floor(time() / $time_frame);
    $hash = sigil_hash($code . '|' . $current_time_frame, $priv);
    return $hash;
}

Dzięki bibliotece SIGIL jesteśmy w stanie zweryfikować, że to faktycznie serwer captcha.kodopol.eu potwierdził wykonanie CAPTCHA. Jeżeli hash zwrócony na backendzie odpowiada hashowi wygenerowanemu przez backend przy użyciu klucza prywatnego, oznacza to, że tylko serwer KODOPOL mógł wygenerować tę zwrotkę.

Biblioteka SIGIL może wydawać się na pierwszy rzut oka skomplikowana, ale w rzeczywistości jest bardzo prosta i stanowi podstawę oraz nieodzowny fundament większości interfejsów programistycznych KODOPOL.