---
title: "Sichere Formulare in WordPress: Eingaben prüfen, Uploads begrenzen, Daten sparsam speichern"
date: 2026-09-30T21:31:49+02:00
modified: 2026-11-10T17:20:15+01:00
category: wordpress
type: how_to
author: Marcel Schönfelder
canonical: https://s-edv.com/anleitungen/wordpress-formulare-absichern-validierung-uploads-datenschutz
keywords:
  - WordPress
  - Formulare
  - Contact Form 7
  - Datenschutz
  - Sicherheit
reading_time: 9
---

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

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 mit Contact Form 7 6.1.7 und Flamingo 2.6.4 durch echte Einsendungen geprüft.

**Kurzfassung:** Kennzeichnen Sie Pflichtfelder mit `*` und begrenzen Sie Textlängen mit `maxlength`. Erlauben Sie bei Datei-Uploads nur konkrete Dateitypen und eine Höchstgröße, Contact Form 7 lehnt dann PHP-Dateien und zu große Dateien ab. Setzen Sie als Absender eine Adresse Ihrer eigenen Domain und die Adresse des Besuchers nur als `Reply-To`. Speichern Sie Einsendungen nur, wenn Sie sie brauchen, und verzichten Sie auf die IP-Adresse. Die Seite mit dem Formular muss per HTTPS ausgeliefert werden.

## Voraussetzungen

- [ ] **WordPress:** eine aktuelle Installation, im Beispiel in deutscher Sprache.
- [ ] **PHP:** mindestens PHP 7.4, das verlangen Contact Form 7 6.1.7 und Flamingo 2.6.4 laut Plugin-Seite.
- [ ] **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](https://s-edv.com/anleitungen/wordpress-https-umstellen-ssl-mixed-content-beheben).
- [ ] **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:

```plaintext
<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. Wird ein Name mit 100 Zeichen direkt an die REST-Schnittstelle von Contact Form 7 gesendet, lautet die Antwort `validation_failed` mit dem Feldhinweis „This field has a too long input.“ Ein leeres Pflichtfeld und eine ungültige E-Mail-Adresse werden 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.

> **Prüfen:** 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:

```plaintext
<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. Vier Fälle, direkt an die Schnittstelle geschickt, ergeben:

| Datei | Ergebnis |
| --- | --- |
| `shell.php` | abgelehnt: „You are not allowed to upload files of this type.“ |
| `rechnung.pdf.php` | abgelehnt, gleiche Meldung |
| PDF mit 1,5 MB bei `limit:1mb` | abgelehnt: „The uploaded file is too large.“ |
| PDF mit 3 MB | abgelehnt: „There was an error uploading the file.“ |
| kleines PDF | angenommen, als Anhang versendet |

Der letzte Fehlerfall hat eine andere Ursache: Die Datei war größer als die PHP-Einstellung `upload_max_filesize`, zum Beispiel 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`). Nach dem Versand ist der Ordner 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](https://s-edv.com/anleitungen/wordpress-uploads-php-ausfuehrung-verhindern-htaccess-nginx).

> **Prüfen:** 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“:

```plaintext
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. Die Benachrichtigung erzeugt 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.

> **Prüfen:** 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. Zum Beispiel landet 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](https://s-edv.com/anleitungen/wordpress-spam-kommentare-formulare-abwehren-datenschutz).

> **Prüfen:** 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 speichert 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:

```plaintext
do_not_store: true
```

Mit dieser Einstellung legt Flamingo keinen neuen Eintrag an, die E-Mail wird 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
<?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 ist das Feld für die IP-Adresse bei neuen Einträgen 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](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=artikel&utm_campaign=47) übernimmt Updates von WordPress, Plugins und Themes mit Kompatibilitätsprüfung, wöchentliche Backups auf externen Speicher und die Firewall.

> **Prüfen:** 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. Ungültige Einsendungen, die direkt an die Schnittstelle geschickt werden, ohne Browser, lehnt die serverseitige Prüfung von Contact Form 7 trotzdem ab.

### 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. In der Regel ist `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.

## 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](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=fazit&utm_campaign=47).

## Weiterführende Anleitungen und Quellen

- [Spam in WordPress-Kommentaren und Formularen abwehren](https://s-edv.com/anleitungen/wordpress-spam-kommentare-formulare-abwehren-datenschutz)
- [PHP-Ausführung im Upload-Ordner verhindern](https://s-edv.com/anleitungen/wordpress-uploads-php-ausfuehrung-verhindern-htaccess-nginx)
- [WordPress auf HTTPS umstellen](https://s-edv.com/anleitungen/wordpress-https-umstellen-ssl-mixed-content-beheben)
- [Contact Form 7 im Plugin-Verzeichnis von wordpress.org](https://wordpress.org/plugins/contact-form-7/)
- [Flamingo im Plugin-Verzeichnis von wordpress.org](https://wordpress.org/plugins/flamingo/)
- [WordPress Developer Handbook: Escaping Data](https://developer.wordpress.org/apis/security/escaping/)
