Ein Kontaktformular ist ein essenzieller Bestandteil jeder Website. In diesem Artikel zeigen wir, wie man ein sicheres Kontaktformular mit HTML, PHP und AJAX erstellt und es mit einem CSRF-Token schützt, um Sicherheitslücken zu vermeiden.
<form id="contact-form">
<input type="hidden" id="csrf_token" name="csrf_token" value="">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">E-Mail:</label>
<input type="email" id="email" name="email" required>
<label for="message">Nachricht:</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Senden</button>
</form>
<p id="response"></p>
Wir erstellen ein einfaches HTML-Formular.
<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
echo json_encode(["csrf_token" => $_SESSION['csrf_token']]);
Wir fügen diesen Code in eine PHP-Datei (csrf_token.php), um ein CSRF-Token zu generieren.
document.addEventListener("DOMContentLoaded", function () {
fetch("csrf_token.php")
.then(response => response.json())
.then(data => {
document.getElementById("csrf_token").value = data.csrf_token;
});
});
Dann laden wir den Token beim Laden der Seite über JavaScript.
document.getElementById("contact-form").addEventListener("submit", function (e) {
e.preventDefault();
let formData = new FormData(this);
fetch("process_form.php", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
document.getElementById("response").textContent = data.message;
})
.catch(error => console.error("Fehler:", error));
});
Nun fügen wir ein Skript hinzu, das das Formular per AJAX an die process_form.php sendet.
<?php
session_start();
header("Content-Type: application/json");
if ($_SERVER["REQUEST_METHOD"] !== "POST") {
echo json_encode(["message" => "Ungültige Anfrage"]);
exit;
}
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
echo json_encode(["message" => "CSRF-Überprüfung fehlgeschlagen"]);
exit;
}
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$message = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
if (empty($name) || empty($email) || empty($message)) {
echo json_encode(["message" => "Bitte alle Felder ausfüllen"]);
exit;
}
$to = "deine-email@example.com";
$subject = "Neue Nachricht von $name";
$headers = "From: $email\r\nReply-To: $email\r\nContent-Type: text/plain; charset=UTF-8";
$mailSent = mail($to, $subject, $message, $headers);
if ($mailSent) {
echo json_encode(["message" => "Nachricht erfolgreich gesendet!"]);
} else {
echo json_encode(["message" => "Fehler beim Senden der Nachricht"]);
}
Hier ist der Code für process_form.php, um das Formular zu verarbeiten und die Nachricht zu versenden.
Wir benötigen einen API-Schlüssel von Google reCAPTCHA
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<form id="contact-form">
<input type="hidden" id="csrf_token" name="csrf_token" value="">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">E-Mail:</label>
<input type="email" id="email" name="email" required>
<label for="message">Nachricht:</label>
<textarea id="message" name="message" required></textarea>
<div class="g-recaptcha" data-sitekey="DEIN_SITE_KEY"></div>
<button type="submit">Senden</button>
</form>
Wir ergänzen das reCAPTCHA-Skript im HTML-Formular.
$recaptchaSecret = "DEIN_SECRET_KEY";
$recaptchaResponse = $_POST['g-recaptcha-response'];
$verifyResponse = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$recaptchaSecret}&response={$recaptchaResponse}");
$responseData = json_decode($verifyResponse);
if (!$responseData->success) {
echo json_encode(["message" => "Bitte reCAPTCHA bestätigen"]);
exit;
}
Wir überprüfen den reCAPTCHA-Token in process_form.php.
<input type="text" name="honeypot" style="display:none;">
Wir ergänzen ein verstecktes Eingabefeld im HTML-Formular.
if (!empty($_POST['honeypot'])) {
echo json_encode(["message" => "Spam erkannt!"]);
exit;
}
Wir überprüfen Honeypot in process_form.php.
session_start();
$_SESSION['form_time'] = time();
Wir starten die zeitbasierte Validierung in csrf_token.php.
if (time() - $_SESSION['form_time'] < 5) {
echo json_encode(["message" => "Zu schnell ausgefüllt, verdächtige Anfrage!"]);
exit;
}
Wir überprüfen die zeitbasierte Validierung in process_form.php.
Mit diesem Setup hat man ein sicheres und modernes Kontaktformular, das AJAX nutzt, um die Seite nicht neu zu laden, und CSRF-Schutz, um Angriffe zu verhindern. So wird sichergestellt, dass ein Kontaktformular zuverlässig und geschützt arbeitet.
Ein CSRF-Token verhindert Cross-Site Request Forgery (CSRF)-Angriffe, indem es sicherstellt, dass nur autorisierte Anfragen akzeptiert werden.
Ja, aber ohne JavaScript wird die Seite beim Absenden neu geladen. Das Formular kann auch mit einem klassischen PHP-POST-Request verarbeitet werden.
Überprüfe, ob der Server die mail()-Funktion unterstützt. Alternativ kann PHPMailer verwendet werden.
Zusätzliche Felder hinzufügen, das Styling mit CSS verbessern oder die Datenbankintegration einbauen.
Dieses Beispiel enthält keinen Spam-Schutz. Im Artikel wird erklärt, wie Spam-Schutz hinzugefügt werden kann.
Ja, aber jedes Formular benötigt sein eigenes CSRF-Token oder man muss den Token für alle Formulare verfügbar machen.
Nutze den erweiterten WYSIWYG-Editor in Shopware 6. Dieser Editor ermöglicht die einfache Einbettung von Medien in die Beschreibung und viele weitere Features.
ab 9,17 €* / Monat
Plugin mietenOptimieren Sie Ihren Shop und schaffen Sie damit ein besseres Erlebnis für Ihre Kunden. Dieses Plugin minimiert die Ladezeit Ihres Shops und bietet zahlreiche Konfigurationen.
ab 24,17 €* / Monat
Plugin mietenErstellen und bearbeiten Sie Ihre eigenen Template-Erweiterungen schnell und einfach in der Administration. Anzeige vorhandener Storefront-Vorlagenpfade und -Inhalte.
ab 3,33 €* / Monat
Plugin mietenHinweis: * Alle Preise verstehen sich zzgl. Mehrwertsteuer
x