Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung WordPress 30.09.2026 · 10 min Lesezeit

Sichere Formulare in WordPress: Eingaben prüfen, Uploads begrenzen, Daten sparsam speichern

Kontaktformulare in WordPress absichern: Pflichtfelder und Längen serverseitig prüfen, Datei-Uploads auf Typ und Größe begrenzen, Absender korrekt setzen, Speicherung und IP-Adressen steuern. Getestet mit Contact Form 7 und Flamingo.

Mit KI erstellt – redaktionelle Prüfung ausstehend

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

Grafik mit der Überschrift Sichere Formulare in WordPress, drei Karten Prüfen, Uploads und Absender und einem stilisierten WordPress-Adminbereich mit Kontaktformular

Ein Kontaktformular ist die offenste Stelle einer WordPress-Website: Jeder kann Daten eingeben, Dateien hochladen und das Formular automatisiert tausendfach abschicken. Gleichzeitig verarbeitet es personenbezogene Daten, die Sie nach DSGVO schützen und nur so lange wie nötig aufbewahren dürfen. Diese Anleitung zeigt am Beispiel von Contact Form 7, wie Sie Eingaben begrenzen, Datei-Uploads sicher einschränken, E-Mails so versenden, dass sie ankommen und nicht als Fälschung gelten, und gespeicherte Nachrichten sowie IP-Adressen im Griff behalten. Alle Einstellungen wurden im Labor mit WordPress 7.1.2, Contact Form 7 6.1.7 und Flamingo 2.6.4 durch echte Einsendungen geprüft.

Voraussetzungen

  • WordPress: eine aktuelle Installation, getestet mit WordPress 7.1.2 in deutscher Sprache.
  • PHP: mindestens PHP 7.4, das verlangen Contact Form 7 6.1.7 und Flamingo 2.6.4 laut Plugin-Seite. Im Labor lief PHP 8.4.
  • Plugin: Contact Form 7 aus dem Plugin-Verzeichnis von wordpress.org. Die Prinzipien gelten für andere Formular-Plugins ebenso, nur die Bezeichnungen unterscheiden sich.
  • Zugriff: Administrator im Backend. Für das optionale Must-Use-Plugin in Schritt 5 brauchen Sie SFTP oder SSH.
  • HTTPS: Die Website muss vollständig über HTTPS laufen, sonst werden Formulardaten unverschlüsselt übertragen. Wie das geht, zeigt WordPress auf HTTPS umstellen.
  • Backup: eine aktuelle Sicherung, bevor Sie bestehende Formulare ändern.

Schritt 1: Pflichtfelder und Eingabelängen festlegen

Jedes Formular sollte nur die Felder enthalten, die Sie für die Bearbeitung wirklich brauchen. Das ist nicht nur ein Gebot der Datensparsamkeit nach Art. 5 DSGVO, sondern verringert auch die Angriffsfläche. Öffnen Sie Formulare > Kontaktformulare und bearbeiten Sie Ihr Formular im Reiter „Formular“.

Contact Form 7 beschreibt Felder mit sogenannten Form-Tags. Ein * hinter dem Feldtyp macht das Feld zur Pflicht, maxlength begrenzt die Länge. Ein schlankes, abgesichertes Kontaktformular:

<label> Name
    [text* your-name maxlength:80 autocomplete:name] </label>

<label> E-Mail
    [email* your-email autocomplete:email] </label>

<label> Nachricht
    [textarea* your-message maxlength:2000] </label>

[submit "Senden"]

Die Längenbegrenzung prüft nicht nur der Browser, sondern auch der Server. Das ist entscheidend, denn Bots umgehen Browserprüfungen, indem sie Daten direkt an die Schnittstelle schicken. Im Labor wurde ein Name mit 100 Zeichen direkt an die REST-Schnittstelle von Contact Form 7 gesendet. Die Antwort lautete validation_failed mit dem Feldhinweis „This field has a too long input.“ Ein leeres Pflichtfeld und eine ungültige E-Mail-Adresse wurden ebenfalls serverseitig abgelehnt.

Der Feldtyp email prüft das Format der Adresse. autocomplete hilft Browsern beim Ausfüllen und verbessert die Barrierefreiheit, weil Hilfsmittel den Zweck des Feldes erkennen.

Verifizieren: Senden Sie das Formular mit leerem Pflichtfeld ab. Unter dem Feld erscheint eine Fehlermeldung, und es wird keine E-Mail versendet.

Schritt 2: Datei-Uploads einschränken oder weglassen

Ein Upload-Feld erlaubt Fremden, Dateien auf Ihren Server zu legen. Fragen Sie sich zuerst, ob Sie es brauchen. Oft genügt ein Hinweis, Unterlagen nach der ersten Kontaktaufnahme per E-Mail zu senden. Wenn Sie Uploads anbieten, legen Sie Dateitypen und Größe fest:

<label> Anhang (PDF oder JPG, max. 1 MB)
    [file your-file limit:1mb filetypes:pdf|jpg] </label>

Im Reiter „E-Mail“ tragen Sie dann [your-file] im Feld „Dateianhänge“ ein, damit die Datei der E-Mail beigefügt wird. Das Labor hat vier Fälle an die Schnittstelle geschickt:

DateiErgebnis
shell.phpabgelehnt: „You are not allowed to upload files of this type.“
rechnung.pdf.phpabgelehnt, gleiche Meldung
PDF mit 1,5 MB bei limit:1mbabgelehnt: „The uploaded file is too large.“
PDF mit 3 MBabgelehnt: „There was an error uploading the file.“
kleines PDFangenommen, als Anhang versendet

Der letzte Fehlerfall hat eine andere Ursache: Die Datei war größer als die PHP-Einstellung upload_max_filesize, im Labor 2 MB. PHP verwirft die Datei dann, bevor das Plugin sie sieht, und liefert nur eine allgemeine Meldung. Wählen Sie limit deshalb kleiner als diesen PHP-Wert, dann erhalten Besucher die verständlichere Meldung.

Contact Form 7 legt hochgeladene Dateien vorübergehend im Ordner wp-content/uploads/wpcf7_uploads ab und schützt ihn mit einer .htaccess, die jeden Zugriff verweigert (Require all denied). Im Labor war der Ordner nach dem Versand wieder leer. Auf nginx wirkt die .htaccess nicht, dort sperren Sie den Ordner in der Server-Konfiguration. Ergänzend sollte PHP im Upload-Ordner generell nicht ausführbar sein, siehe PHP-Ausführung im Upload-Ordner verhindern.

Verifizieren: Ein Upload einer Datei mit nicht erlaubter Endung wird mit einer Fehlermeldung am Feld abgelehnt, und wp-content/uploads/wpcf7_uploads enthält nach dem Versand nur die .htaccess.

Schritt 3: Absender und Antwortadresse richtig setzen

Ein häufiger Fehler: Als Absender der Benachrichtigung steht die Adresse des Besuchers. Die E-Mail kommt dann scheinbar von max@example.test, wird aber von Ihrem Server verschickt. Empfangende Mailserver prüfen per SPF, DKIM und DMARC, ob der Server für diese Domain senden darf. Das darf er nicht, und die Nachricht landet im Spam oder wird abgewiesen.

Richtig ist: Absender ist eine Adresse Ihrer eigenen Domain, die Adresse des Besuchers steht im Kopf Reply-To. So antworten Sie mit einem Klick direkt an den Besucher. Im Reiter „E-Mail“:

An:                    kontakt@ihre-domain.de
Von:                   [_site_title] <wordpress@ihre-domain.de>
Betreff:               Kontaktanfrage
Zusätzliche Header:    Reply-To: [your-email]

Contact Form 7 prüft die Konfiguration und meldet laut Plugin-Code „Die Absender-E-Mail-Adresse gehört nicht zur Domain der Website.“, wenn der Absender nicht zur eigenen Domain passt. Nehmen Sie diesen Hinweis ernst. Im Labor erzeugte die Benachrichtigung die Kopfzeilen From: Testlabor W4 <admin@example.test> und Reply-To: max@example.test.

Übernehmen Sie Eingaben des Besuchers nicht in den Betreff oder den Absendernamen. Ein Bot kann dort beliebigen Text einsetzen, der dann in Ihrer E-Mail-Übersicht erscheint. Einen festen Betreff wie „Kontaktanfrage“ sortieren Sie außerdem leichter.

Damit E-Mails zuverlässig ankommen, sollte WordPress über einen echten Mailserver per SMTP versenden statt über die PHP-Funktion mail(). Das richten Sie mit einem SMTP-Plugin und den Zugangsdaten Ihres E-Mail-Anbieters ein.

Verifizieren: Senden Sie eine Testnachricht. In der empfangenen E-Mail zeigt der Absender Ihre Domain, und „Antworten“ adressiert die im Formular eingetragene Adresse.

Schritt 4: Eingaben nicht blind vertrauen

Contact Form 7 speichert Eingaben so, wie sie eingegeben wurden. Im Labor landete ein Name mit <script>-Tag unverändert in der gespeicherten Nachricht. Das ist bei reinen Textmails unkritisch, wird aber gefährlich, wenn Sie Eingaben weiterverarbeiten: in HTML-Mails, in einem eigenen Theme-Template, in einem Export für die Tabellenkalkulation oder in einem CRM.

Drei Regeln helfen:

  • Textmails verwenden: Lassen Sie im Reiter „E-Mail“ die Option für HTML-Inhalte ausgeschaltet, sofern Sie keine Gestaltung brauchen.
  • Bei der Ausgabe escapen: Wer Formulardaten in eigenem PHP-Code ausgibt, nutzt die WordPress-Funktionen esc_html() und esc_attr(). Das Developer Handbook beschreibt dieses Prinzip unter „Escaping Data“: bei der Ausgabe escapen, so spät wie möglich.
  • Exporte prüfen: Beginnt ein Feldinhalt mit =, +, - oder @, kann eine Tabellenkalkulation ihn als Formel ausführen. Öffnen Sie Exporte aus Formular-Plugins deshalb mit Vorsicht und nicht mit automatischer Formelauswertung.

Gegen massenhafte automatisierte Einsendungen helfen Spam-Schutz-Verfahren. Wie Sie das datensparsam einrichten, beschreibt Spam in Kommentaren und Formularen abwehren.

Verifizieren: Ihre E-Mail-Vorlage nutzt reinen Text, und eigener Code, der Formulardaten ausgibt, verwendet esc_html() oder esc_attr().

Schritt 5: Speicherung und IP-Adressen steuern

Contact Form 7 selbst speichert keine Einsendungen, es verschickt nur E-Mails. Erst Zusatz-Plugins wie Flamingo legen jede Nachricht zusätzlich in der Datenbank ab, unter Flamingo > Inbound Messages. Das ist praktisch, wenn eine E-Mail verloren geht, bedeutet aber eine zweite Kopie personenbezogener Daten, die Sie löschen müssen, sobald der Zweck erfüllt ist.

Flamingo speicherte im Labor neben den Feldern auch die IP-Adresse des Absenders. Wenn Sie die Speicherung für ein Formular nicht brauchen, schalten Sie sie im Reiter „Zusätzliche Einstellungen“ ab:

do_not_store: true

Im Labor legte Flamingo mit dieser Einstellung keinen neuen Eintrag an, die E-Mail wurde trotzdem versendet. Soll gespeichert werden, aber ohne IP-Adresse, hilft der Filter wpcf7_remote_ip_addr, den Contact Form 7 für die IP-Ermittlung bereitstellt. Legen Sie dafür ein kleines Must-Use-Plugin an:

<?php
// Datei: wp-content/mu-plugins/cf7-keine-ip.php
// IP-Adresse aus Formulareinsendungen nicht speichern
add_filter( 'wpcf7_remote_ip_addr', '__return_empty_string' );

Danach war das Feld für die IP-Adresse bei neuen Einträgen im Labor leer. Ältere Einträge bleiben unverändert, die löschen Sie bei Bedarf in Flamingo. Beachten Sie: Flamingo verschiebt laut Plugin-Code nur als Spam markierte Nachrichten nach 30 Tagen automatisch in den Papierkorb. Normale Nachrichten bleiben, bis Sie sie löschen. Legen Sie eine Frist fest und löschen Sie regelmäßig. Die Pflichtangaben zu Einwilligung und Datenschutzhinweis sind ein eigenes Thema und hängen von Ihrem Einzelfall ab.

Formular-Plugins gehören zu den Plugins, in denen regelmäßig Sicherheitslücken geschlossen werden. Updates, Backups und die Kontrolle der gespeicherten Daten sind daher Daueraufgaben. Wer sie nicht selbst im Kalender halten möchte, kann sie abgeben: Die WordPress-Wartung von wordpressupdate.de übernimmt Updates von WordPress, Plugins und Themes mit Kompatibilitätsprüfung, wöchentliche Backups auf externen Speicher und die Firewall.

Verifizieren: Nach einer Testeinsendung erscheint bei do_not_store: true kein neuer Eintrag in Flamingo. Mit Speicherung und aktivem Filter enthält der neue Eintrag keine IP-Adresse.

Typische Fehler

  • „There was an error uploading the file.“ bei großen Dateien: Die Datei überschreitet upload_max_filesize von PHP. limit im Form-Tag kleiner wählen oder den PHP-Wert beim Hoster anpassen.
  • E-Mails landen im Spam oder kommen nicht an: Absender ist die Adresse des Besuchers oder eine fremde Domain. Eigene Adresse als Absender, Besucher als Reply-To, Versand per SMTP.
  • Anhang fehlt in der E-Mail: [your-file] fehlt im Feld „Dateianhänge“ des Reiters „E-Mail“, oder der Feldname stimmt nicht überein.
  • Nachrichten sammeln sich über Jahre: Flamingo löscht normale Nachrichten nicht automatisch. Löschfrist festlegen oder mit do_not_store: true gar nicht erst speichern.
  • Browser meldet „nicht sicher“ beim Absenden: Die Seite oder das Formularziel läuft über HTTP. HTTPS vollständig einrichten.

Häufige Fragen

Reicht die Prüfung im Browser nicht aus?

Nein. Browserprüfungen sind eine Hilfe für ehrliche Besucher. Bots senden Daten direkt an den Server. Im Labor wurden alle Einsendungen direkt an die Schnittstelle geschickt, ohne Browser. Die serverseitige Prüfung von Contact Form 7 hat sie trotzdem abgelehnt.

Soll ich ein CAPTCHA einbauen?

Das hängt vom Spam-Aufkommen ab. Viele CAPTCHA-Dienste übertragen Daten an Dritte und brauchen dann eine Rechtsgrundlage. Datensparsame Alternativen beschreibt die Anleitung zur Spam-Abwehr.

Wo liegen hochgeladene Dateien nach dem Versand?

Contact Form 7 hängt sie an die E-Mail an und entfernt sie danach aus dem temporären Ordner. Im Labor war wpcf7_uploads nach jedem Versand leer. Die Datei existiert dann nur noch in Ihrem Postfach.

Brauche ich Flamingo überhaupt?

Nur, wenn Sie eine zweite Kopie der Nachrichten in WordPress wollen, etwa weil E-Mails verloren gehen könnten. Ohne Flamingo gibt es keine Speicherung in der Datenbank und damit auch nichts zu löschen.

Testumfang

Wir haben in einer Testumgebung mit WordPress 7.1.2 alle Einsendungen per curl direkt an die REST-Schnittstelle von Contact Form 7 geschickt. Geprüft haben wir vor allem Pflichtfelder und Dateiuploads, die E-Mails selbst wurden per Filter abgefangen und nicht versendet.

Nicht getestet haben wir den echten Mailversand per SMTP sowie den Betrieb unter nginx. Probieren Sie die Anleitung deshalb zuerst auf einer Kopie Ihrer Website aus.

Fazit

Ein sicheres Formular fragt nur ab, was nötig ist, prüft jede Eingabe auf dem Server, lässt nur definierte Dateien zu, sendet mit eigener Absenderadresse und speichert Daten nur, solange sie gebraucht werden. Mit Contact Form 7 erreichen Sie das ohne zusätzliche Plugins, nur mit Form-Tags, den Mail-Einstellungen und einer Zeile in den zusätzlichen Einstellungen. Wenn Sie Updates und Backups dafür lieber abgeben, übernimmt das die WordPress-Wartung von Marcel Schönfelder.

Weiterführende Anleitungen und Quellen

WordPressFormulareContact Form 7DatenschutzSicherheit