Hab auch mal nachgefragt
1. Captcha regenerieren nach jeder Anfrage
Der häufigste Fehler ist, dass das Captcha nach der ersten Generierung weiterhin gültig bleibt. Falls jemand das Captcha ausliest, kann er es beliebig oft verwenden. Lösung: Lösche das Captcha direkt nach der Überprüfung:
Code: Alles auswählen
session_start();
if (!isset($_SESSION['captcha_word']) || trim($_POST['captcha']) !== $_SESSION['captcha_word']) {
header("Location: fehler.html");
exit;
}
// Captcha direkt ungültig machen!
unset($_SESSION['captcha_word']);
echo "Captcha korrekt!";
2. Captcha-Token einführen
Statt nur das Wort zu speichern, kannst du zusätzlich ein Token verwenden.
Der Nutzer bekommt das Captcha-Bild + einen zufälligen Token.
Beim Absenden wird geprüft, ob Token und Captcha-Wort übereinstimmen.
Code: Alles auswählen
session_start();
$captcha_word = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789"), 0, 6);
$captcha_token = bin2hex(random_bytes(16)); // Sichere, zufällige ID
$_SESSION['captchas'][$captcha_token] = $captcha_word; // Captcha speichern
// Captcha-Bild generieren (z. B. mit GD oder ImageMagick)
header("Content-Type: image/png");
// Hier dein Code zur Captcha-Erstellung einfügen...
echo json_encode(["token" => $captcha_token]); // Token an den Nutzer senden
Captcha-Prüfung (mailendfassung.php):
Code: Alles auswählen
session_start();
$token = $_POST['captcha_token'] ?? '';
$captcha = $_POST['captcha'] ?? '';
if (!isset($_SESSION['captchas'][$token]) || $captcha !== $_SESSION['captchas'][$token]) {
header("Location: fehler.html");
exit;
}
// Nach Überprüfung löschen
unset($_SESSION['captchas'][$token]);
echo "Captcha korrekt!";

Vorteil: Selbst wenn das Captcha sichtbar ist, kann es nicht ohne den passenden Token benutzt werden.
3. Rate-Limit setzen
Verhindere, dass jemand unendlich viele Captchas ausprobiert:
IP-Sperre: Speichere die Anzahl der Versuche pro IP.
Zeitbasierte Sperre: Zwinge einen kurzen Delay zwischen Versuchen.
Code: Alles auswählen
session_start();
$ip = $_SERVER['REMOTE_ADDR'];
$versuche = $_SESSION['captcha_versuche'][$ip] ?? 0;
if ($versuche >= 5) {
die("Zu viele Versuche, bitte warten.");
}
$_SESSION['captcha_versuche'][$ip] = $versuche + 1;
// Captcha-Überprüfung ...

Vorteil: Angreifer können nicht einfach per cURL Millionen von Captchas testen.
4. Referrer prüfen
Akzeptiere nur Captcha-Eingaben von deiner Website:
Code: Alles auswählen
if (!isset($_SERVER['HTTP_REFERER']) || !str_contains($_SERVER['HTTP_REFERER'], "niederastroth.de")) {
die("Ungültige Anfrage!");
}

Achtung: HTTP_REFERER kann manipuliert werden, aber es hilft gegen einfache cURL-Angriffe.
Mit diesen Methoden machst du es Angreifern schwer, das Captcha einfach per cURL zu umgehen.
Falls du Fragen hast, gerne fragen!
