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
- Skopiuj funkcje
generuj_captcha()isprawdz_captcha()do pliku ze swoim formularzem. - Na początku pliku wywołaj
session_start()— CAPTCHA trzyma poprawny wynik w sesji. - W formularzu wyświetl pytanie i dodaj pole
captcha; po wysłaniu sprawdź odpowiedź funkcjąsprawdz_captcha()zanim wykonasz właściwą akcję. - 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
Formularze
Formularz kontaktowy z wysyłką e-mail
Kompletny formularz kontaktowy w PHP: walidacja pól, ochrona przed spamem (honeypot), wysyłka wiadomości funkcją mail() i komunikat o powodzeniu.
początkujący Zobacz kod → FormularzeWalidacja danych z formularza (e-mail, telefon, NIP, PESEL)
Zestaw gotowych funkcji do sprawdzania danych z formularzy: adres e-mail, adres WWW, polski numer telefonu, kod pocztowy oraz NIP i PESEL z sumą kontrolną.
początkujący Zobacz kod →