'; } /** * Prueft das mitgeschickte Token. Akzeptiert das Formularfeld und den * Header X-CSRF-Token, damit auch AJAX-Aufrufe funktionieren. */ function csrf_valid(): bool { if (empty($_SESSION['csrf_token'])) { return false; } $token = $_POST['csrf_token'] ?? ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? ''); if (!is_string($token) || $token === '') { return false; } return hash_equals($_SESSION['csrf_token'], $token); } /** * Bricht jeden POST ohne gueltiges Token ab. Fuer GET-Anfragen wirkungslos. */ function csrf_require(): void { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { return; } if (csrf_valid()) { return; } http_response_code(403); $istAjax = ($_SERVER['HTTP_X_REQUESTED_WITH'] ?? '') === 'XMLHttpRequest'; if ($istAjax) { header('Content-Type: application/json'); echo json_encode(['error' => 'Sicherheitstoken ungueltig. Bitte neu anmelden.']); exit; } header('Content-Type: text/html; charset=utf-8'); echo '