Przejdź do treści

Prosta CAPTCHA matematyczna (bez obrazków)

  • Formularze
  • poziom: początkujący
  • aktualizacja: 12 lipca 2026

Nie każda strona potrzebuje reCAPTCHY od Google. Do zatrzymania większości botów spamujących formularze wystarczy proste pytanie w stylu „5 + 3 = ?", którego odpowiedź trzymamy w sesji po stronie serwera.

Taka CAPTCHA jest przyjazna dla użytkowników i RODO — nie wysyła żadnych danych do zewnętrznych firm.

PHP 81 linii Pobierz .php
<?php
/**
 * Prosta CAPTCHA matematyczna — skryptyPHP.com
 * Zapisz jako: captcha-demo.php (albo wklej funkcje do swojego formularza)
 */

session_start();

/**
 * Losuje działanie, zapisuje wynik w sesji i zwraca treść pytania.
 */
function generuj_captcha(): string
{
    $a = random_int(2, 9);
    $b = random_int(1, 9);

    if (random_int(0, 1) === 1) {
        $_SESSION['captcha_wynik'] = $a + $b;
        return "$a + $b";
    }

    // Przy odejmowaniu unikamy wyników ujemnych
    if ($b > $a) {
        [$a, $b] = [$b, $a];
    }
    $_SESSION['captcha_wynik'] = $a - $b;
    return "$a − $b";
}

/**
 * Sprawdza odpowiedź użytkownika. Wynik jest jednorazowy —
 * po sprawdzeniu zostaje usunięty z sesji.
 */
function sprawdz_captcha(?string $odpowiedz): bool
{
    $poprawna = $_SESSION['captcha_wynik'] ?? null;
    unset($_SESSION['captcha_wynik']);

    return $poprawna !== null
        && trim((string) $odpowiedz) !== ''
        && (int) trim((string) $odpowiedz) === $poprawna;
}

// ── PRZYKŁAD UŻYCIA ─────────────────────────────────────────
$komunikat = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (sprawdz_captcha($_POST['captcha'] ?? null)) {
        $komunikat = 'Poprawnie! Tu wykonaj właściwą akcję formularza.';
        // np. wysyłka wiadomości, zapis do bazy...
    } else {
        $komunikat = 'Błędny wynik działania. Spróbuj jeszcze raz.';
    }
}

// Nowe pytanie generujemy ZAWSZE po sprawdzeniu poprzedniego
$pytanie = generuj_captcha();
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Demo CAPTCHA</title>
</head>
<body>

<?php if ($komunikat): ?>
    <p><strong><?= htmlspecialchars($komunikat) ?></strong></p>
<?php endif; ?>

<form method="post" action="">
    <label>
        Ile to jest <?= htmlspecialchars($pytanie) ?> ?
        <input type="text" name="captcha" required autocomplete="off"
               inputmode="numeric" size="4">
    </label>
    <button type="submit">Sprawdź</button>
</form>

</body>
</html>

Jak użyć tego skryptu

  1. Skopiuj funkcje generuj_captcha() i sprawdz_captcha() do pliku ze swoim formularzem.
  2. Na początku pliku wywołaj session_start() — CAPTCHA trzyma poprawny wynik w sesji.
  3. W formularzu wyświetl pytanie i dodaj pole captcha; po wysłaniu sprawdź odpowiedź funkcją sprawdz_captcha() zanim wykonasz właściwą akcję.
  4. Pamiętaj, aby po każdym sprawdzeniu wygenerować nowe pytanie (w przykładzie dzieje się to automatycznie).

Warto wiedzieć

  • Wynik działania przechowywany jest wyłącznie po stronie serwera (w sesji) — bot nie znajdzie go w kodzie HTML.
  • Odpowiedź jest jednorazowa: sprawdz_captcha() od razu usuwa wynik z sesji, co blokuje wielokrotne wysyłki tej samej odpowiedzi.
  • Do losowania używamy random_int() — kryptograficznie bezpiecznego generatora dostępnego od PHP 7.
  • Prosta CAPTCHA zatrzyma masowe boty, ale nie zdeterminowanego człowieka — do krytycznych formularzy (np. rejestracji) rozważ dodatkowo limit prób na adres IP.
#captcha #spam #formularz #sesje #boty

Podobne skrypty