false, 'message' => 'Konfigurationsfehler. Bitte kontaktieren Sie den Administrator.' ]); exit; } require_once __DIR__ . '/config.php'; // Header für JSON-Response setzen header('Content-Type: application/json; charset=utf-8'); // Nur POST-Requests erlauben if ($_SERVER['REQUEST_METHOD'] !== 'POST') { ob_clean(); http_response_code(405); echo json_encode([ 'success' => false, 'message' => 'Nur POST-Requests erlaubt.' ]); exit; } /** * Rate-Limiting prüfen */ function checkRateLimit() { if (isset($_SESSION['last_submission'])) { $timeSinceLastSubmit = time() - $_SESSION['last_submission']; if ($timeSinceLastSubmit < RATE_LIMIT_SECONDS) { return [ 'allowed' => false, 'wait_time' => RATE_LIMIT_SECONDS - $timeSinceLastSubmit ]; } } return ['allowed' => true]; } /** * Eingabe bereinigen und validieren */ function sanitizeInput($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); return $data; } /** * E-Mail-Adresse validieren */ function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } /** * CSRF-Token validieren (einfache Implementierung) */ function validateCSRF($token) { // Erwarteter Token-Wert (sollte mit dem im Formular übereinstimmen) return $token === 'frida-fred-csrf-2026'; } // Rate-Limiting prüfen $rateLimitCheck = checkRateLimit(); if (!$rateLimitCheck['allowed']) { ob_clean(); http_response_code(429); echo json_encode([ 'success' => false, 'message' => 'Bitte warten Sie ' . $rateLimitCheck['wait_time'] . ' Sekunden, bevor Sie erneut eine Nachricht senden.' ]); exit; } // Honeypot-Feld prüfen (sollte leer sein) if (!empty($_POST['website'])) { ob_clean(); http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Spam erkannt.' ]); exit; } // CSRF-Token prüfen if (!isset($_POST['csrf_token']) || !validateCSRF($_POST['csrf_token'])) { ob_clean(); http_response_code(403); echo json_encode([ 'success' => false, 'message' => 'Ungültiger Sicherheitstoken.' ]); exit; } // Formularfelder auslesen und validieren $name = isset($_POST['name']) ? sanitizeInput($_POST['name']) : ''; $email = isset($_POST['email']) ? sanitizeInput($_POST['email']) : ''; $subject = isset($_POST['subject']) ? sanitizeInput($_POST['subject']) : ''; $message = isset($_POST['message']) ? sanitizeInput($_POST['message']) : ''; // Pflichtfelder prüfen if (empty($name) || empty($email) || empty($subject) || empty($message)) { ob_clean(); http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Bitte füllen Sie alle erforderlichen Felder aus.' ]); exit; } // E-Mail-Adresse validieren if (!validateEmail($email)) { ob_clean(); http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Bitte geben Sie eine gültige E-Mail-Adresse ein.' ]); exit; } // Nachrichtenlänge prüfen if (strlen($message) > MAX_MESSAGE_LENGTH) { ob_clean(); http_response_code(400); echo json_encode([ 'success' => false, 'message' => 'Ihre Nachricht ist zu lang. Maximal ' . MAX_MESSAGE_LENGTH . ' Zeichen erlaubt.' ]); exit; } // E-Mail-Inhalt erstellen $emailSubject = 'Kontaktanfrage: ' . $subject; $emailBodyText = "Neue Kontaktanfrage über " . FORM_NAME . "\n\n"; $emailBodyText .= "Name: " . $name . "\n"; $emailBodyText .= "E-Mail: " . $email . "\n"; $emailBodyText .= "Betreff: " . $subject . "\n\n"; $emailBodyText .= "Nachricht:\n" . $message . "\n\n"; $emailBodyText .= "---\n"; $emailBodyText .= "Gesendet am: " . date('d.m.Y H:i:s') . "\n"; $emailBodyText .= "IP-Adresse: " . $_SERVER['REMOTE_ADDR'] . "\n"; // HTML-Version der E-Mail $emailBodyHTML = '

Neue Kontaktanfrage

Von: ' . htmlspecialchars($name) . '
Betreff: ' . htmlspecialchars($subject) . '
Nachricht:
' . nl2br(htmlspecialchars($message)) . '
'; // PHPMailer-Instanz erstellen $mail = new PHPMailer(true); try { // SMTP-Konfiguration $mail->isSMTP(); $mail->Host = SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = SMTP_USERNAME; $mail->Password = SMTP_PASSWORD; $mail->SMTPSecure = SMTP_SECURE; $mail->Port = SMTP_PORT; $mail->CharSet = 'UTF-8'; // Debug-Ausgabe deaktivieren (für Produktion) $mail->SMTPDebug = 0; $mail->Debugoutput = function($str, $level) { // Debug-Ausgaben unterdrücken }; // Absender $mail->setFrom(SMTP_FROM_EMAIL, SMTP_FROM_NAME); $mail->addReplyTo($email, $name); // Empfänger $mail->addAddress(RECIPIENT_EMAIL, RECIPIENT_NAME); // E-Mail-Inhalt $mail->isHTML(true); $mail->Subject = $emailSubject; $mail->Body = $emailBodyHTML; $mail->AltBody = $emailBodyText; // E-Mail senden $mail->send(); // Zeitstempel für Rate-Limiting speichern $_SESSION['last_submission'] = time(); // Output Buffer leeren ob_clean(); http_response_code(200); echo json_encode([ 'success' => true, 'message' => 'Vielen Dank! Ihre Nachricht wurde erfolgreich versendet. Wir werden uns bald bei Ihnen melden.' ]); } catch (Exception $e) { // Fehler beim E-Mail-Versand // Output Buffer leeren ob_clean(); http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Es gab ein Problem beim Senden Ihrer Nachricht. Bitte versuchen Sie es später erneut oder kontaktieren Sie uns direkt per E-Mail.' // 'error' => $mail->ErrorInfo // Nur für Debugging aktivieren! ]); } exit;