Wenn Angreifer es auf Formulare abgesehen haben, füllen sie diese nicht normal aus. Stattdessen senden sie Code, der in deine Systeme eindringen oder Daten stehlen soll. Sie schicken zum Beispiel JavaScript, das im Browser deiner Besucher läuft, SQL-Befehle, die deine Datenbank beschädigen, oder schädliche Inhalte. Eingabevalidierung und Bereinigung sind die Schutzmassnahmen, die diese Angriffe stoppen.
Das lernst du hier: Was Eingabevalidierung und Bereinigung sind, worin sie sich unterscheiden, wie Injection-Angriffe funktionieren, welcher Schutz bei welchen Datentypen hilft und wie du beides in deinen Formularen umsetzt.
Was ist Eingabevalidierung?
Eingabevalidierung prüft, ob die Daten, die an dein Formular gesendet werden, das erwartete Format haben und deine Vorgaben erfüllen. Sie ist die erste Verteidigungslinie gegen schädliche Eingaben.
Die Validierung beantwortet Fragen wie diese: Ist das eine E-Mail-Adresse oder zufälliger Text? Ist das eine Zahl oder ein Wort? Ist das Feld leer, obwohl es das nicht sein sollte? Hat der Besucher etwas eingegeben, das für dieses Feld sinnvoll ist, oder etwas Verdächtiges?
Beispiele dafür, was die Validierung prüft:
- Ein E-Mail-Feld sollte ein @-Zeichen und eine Domain enthalten
- Ein Telefonnummernfeld sollte nur Ziffern und Bindestriche enthalten
- Ein Zahlenfeld sollte keine Buchstaben enthalten
- Ein Pflichtfeld sollte nicht leer sein
- Ein Passwortfeld sollte eine Mindestlänge erfüllen
Die Validierung findet an zwei Stellen statt. Auf dem Gerät des Besuchers heisst sie clientseitige Validierung. Auf deinem Server heisst sie serverseitige Validierung. Die clientseitige Validierung gibt Besuchern sofort Rückmeldung, wenn sie sich vertippt haben. Die serverseitige Validierung schützt wirklich vor Angriffen, weil Angreifer clientseitige Prüfungen umgehen können.
Was ist Bereinigung von Eingaben?
Bereinigung (Sanitization) entfernt alles Gefährliche aus Eingaben oder macht es unschädlich, bevor du die Daten speicherst oder verarbeitest. Auch Daten, die die Validierung bestehen, können Code oder Zeichen enthalten, die Schaden anrichten sollen.
Beispiele dafür, was die Bereinigung tut:
- Sie entfernt HTML-Tags wie `<script>` und `<img>` aus Textfeldern
- Sie entfernt SQL-Sonderzeichen, mit denen sich Datenbanken angreifen lassen
- Sie maskiert Sonderzeichen, damit sie als Text und nicht als Code behandelt werden
- Sie begrenzt die Länge der Eingabe, um Buffer-Overflow-Angriffe zu verhindern
Validierung und Bereinigung arbeiten zusammen, erfüllen aber unterschiedliche Aufgaben. Die Validierung prüft, ob die Daten im richtigen Format vorliegen. Die Bereinigung entfernt alles Gefährliche, auch wenn das Format formal korrekt ist.
So funktionieren Injection-Angriffe
SQL-Injection
Eine SQL-Injection passiert, wenn ein Angreifer SQL-Code in ein Formularfeld schreibt. Wenn dein Formular diese Eingabe nicht bereinigt, wird der SQL-Code auf deiner Datenbank ausgeführt.
Beispiel: Ein Login-Formular fragt nach einer E-Mail-Adresse. Statt seiner E-Mail sendet ein Angreifer:
' OR '1'='1 Wenn dein Formular das nicht bereinigt, führt dein Code womöglich eine SQL-Abfrage wie diese aus:
SELECT * FROM users WHERE email = '' OR '1'='1' Der Teil `OR '1'='1'` macht die Bedingung immer wahr. Die Abfrage liefert dann alle Nutzer zurück statt nur den mit dieser E-Mail-Adresse. Der Angreifer hat damit das Login umgangen.
Cross-Site Scripting (XSS)
Ein XSS-Angriff passiert, wenn ein Angreifer JavaScript-Code in ein Formularfeld schreibt. Wenn das Formular diesen Code nicht bereinigt und speichert, läuft das JavaScript später im Browser aller, die diese Daten ansehen.
Beispiel: Ein Kommentarformular nimmt Nutzerkommentare an. Ein Angreifer sendet:
<script>alert('hacked')</script> Wird das nicht bereinigt und in der Datenbank gespeichert, läuft das JavaScript, sobald jemand den Kommentarbereich öffnet, und zeigt eine Meldung an. Eine gefährlichere Variante könnte Cookies stehlen, Besucher auf eine Phishing-Seite umleiten oder Formulardaten auslesen.
Command-Injection
Wenn deine Formulardaten in Systembefehlen verwendet werden (was in manchen Backend-Systemen vorkommt), kann ein Angreifer Betriebssystembefehle einschleusen.
Beispiel: Ein Formularfeld wird in einem Befehl wie diesem verwendet:
ffmpeg -i $filename output.mp4 Wenn `$filename` nicht bereinigt wird und ein Angreifer `;rm -rf /` sendet, lautet der Befehl:
ffmpeg -i ;rm -rf / output.mp4 Der Befehl `rm -rf /` wird ausgeführt und löscht Dateien auf dem System. Deshalb sollten Systembefehle niemals unbereinigte Nutzereingaben erhalten.
Validierung und Bereinigung für verschiedene Datentypen
E-Mail-Adressen
Validierung: Prüfe, ob die Eingabe einem E-Mail-Muster entspricht (etwa text@domain.endung). Stelle sicher, dass nur erlaubte Zeichen vorkommen.
Bereinigung: Entferne HTML-Tags und Sonderzeichen. Behalte nur Buchstaben, Ziffern, Punkte, Bindestriche und das @-Zeichen.
Telefonnummern
Validierung: Prüfe, ob nur Ziffern, Bindestriche, Klammern und Leerzeichen vorkommen. Kontrolliere, ob die Länge zum erwarteten Land passt.
Bereinigung: Entferne alle nicht numerischen Zeichen ausser Bindestrichen und Klammern. Entferne bei Bedarf führende Nullen oder Leerzeichen.
Textfelder (Kommentare, Namen, Adressen)
Validierung: Prüfe, ob das Feld nicht leer ist und die Länge vernünftig ist (nicht Millionen von Zeichen).
Bereinigung: Entferne oder maskiere HTML-Tags, JavaScript und SQL-Sonderzeichen. Behalte nur einfachen Text und grundlegende Satzzeichen.
Zahlen und Beträge
Validierung: Prüfe, ob die Eingabe eine Zahl ist. Bei Preisen oder Mengen prüfe, ob es eine positive Zahl ist.
Bereinigung: Entferne alle nicht numerischen Zeichen. Runde bei Bedarf auf die richtige Anzahl an Nachkommastellen.
Passwörter
Validierung: Prüfe die Mindestlänge (mindestens 8 Zeichen) und verlange optional eine Mischung aus Gross- und Kleinbuchstaben, Zahlen und Symbolen.
Bereinigung: Entferne oder verändere Passwörter nicht. Sie sollten in ihrer exakten Form gespeichert werden (als Hash, nie im Klartext). Wenn du Zeichen aus einem Passwort entfernst, können sich Nutzer nicht mehr anmelden.
Datei-Uploads
Validierung: Prüfe, ob der Dateityp dem entspricht, was du erwartest (z. B. nur PDF-Dateien, nur Bilder). Prüfe, dass die Datei nicht zu gross ist.
Bereinigung: Benenne die Datei um, damit Angreifer keine speziellen Dateinamen nutzen können. Scanne die Datei auf Schadsoftware. Speichere sie ausserhalb des Web-Root-Verzeichnisses, damit sie nicht als Code ausgeführt werden kann.
So setzt du Validierung und Bereinigung um
Clientseitig (im Browser)
Nutze die Validierungsattribute von HTML5, um Besuchern sofort Rückmeldung zu geben:
<input type="email" name="email" required> <input type="tel" name="phone" pattern="[0-9]{10}"> <input type="number" name="age" min="0" max="120"> Das fängt offensichtliche Fehler ab und verbessert die Nutzererfahrung. Die clientseitige Validierung lässt sich jedoch umgehen. Als Sicherheitsmassnahme reicht sie deshalb allein nicht aus.
Serverseitig (auf deinem Server)
Hier entscheidet sich die Sicherheit. Dein Backend-Code muss jedes einzelne Datenstück validieren und bereinigen:
// Pseudocode-Beispiel if (email does not match email pattern) { reject the submission } // HTML-Tags entfernen sanitized_comment = remove_html_tags(comment_text) // Sonderzeichen für die Datenbank maskieren safe_name = escape_sql_characters(user_name) // Erst dann die Daten speichern store_in_database(safe_name, sanitized_comment) Parametrisierte Abfragen für Datenbanken nutzen
Der beste Schutz gegen SQL-Injection sind parametrisierte Abfragen (auch Prepared Statements genannt). Statt Nutzereingaben direkt in eine SQL-Abfrage zu schreiben, nutzt du Platzhalter und übergibst die Daten getrennt:
// Schlecht (angreifbar): query = "SELECT * FROM users WHERE email = '" + email + "'" // Gut (sicher): query = "SELECT * FROM users WHERE email = ?" execute(query, [email]) Bei parametrisierten Abfragen weiss der SQL-Parser, dass die Nutzereingabe Daten sind und kein Code. Selbst wenn ein Angreifer SQL-Code sendet, wird er als einfacher Text behandelt.
Bibliotheken und Frameworks nutzen
Schreibe Bereinigungscode nicht von Grund auf selbst. Nutze etablierte Bibliotheken, die genau dafür gebaut wurden. In PHP nutzt du htmlspecialchars() oder eine Bibliothek wie HTML Purifier. In Python nutzt du das Modul `html` oder eine Bibliothek wie bleach. In Node.js nutzt du `express-validator` oder Ähnliches. Diese Bibliotheken sind getestet und werden aktualisiert, damit sie neue Angriffsarten abdecken.
Häufige Fehler bei Validierung und Bereinigung
Nur clientseitig validieren. Die clientseitige Validierung dient der Nutzererfahrung, nicht der Sicherheit. Ein Angreifer kann sie umgehen. Du musst auch auf dem Server validieren.
Gefährliche Zeichen sperren, statt sichere Zeichen zu erlauben. Wenn du SQL-Injection durch das Entfernen von Semikolons und Anführungszeichen verhindern willst, finden Angreifer Wege drumherum. Erlaube stattdessen nur die Zeichen, die du erwartest (bei Telefonnummern nur Ziffern und Bindestriche), und lehne alles andere ab.
Dem Datentyp des Formularfelds vertrauen. Bei einem Zahlenfeld sendet der Browser Text, der wie eine Zahl aussieht. Dein Server muss trotzdem prüfen, ob es wirklich eine Zahl ist, bevor er sie verwendet. Gehe nie davon aus, dass der Datentyp stimmt.
Angezeigte Daten nicht bereinigen. Auch wenn Daten sicher gespeichert sind: Zeigst du sie auf einer Webseite ohne HTML-Maskierung an, können Angreifer Code einschleusen, der im Browser der Besucher läuft, sobald sie diese Daten ansehen.
Bereinigen in der falschen Reihenfolge. Validiere zuerst (hat es das richtige Format?), bereinige danach (ist es sicher?). Wenn du erst bereinigst und dann validierst, lehnst du womöglich Daten ab, die eigentlich sicher waren.
Was WEMASY für die Eingabevalidierung tut
WEMASY validiert Formularfelder automatisch anhand des Feldtyps, den du wählst. E-Mail-Felder werden auf ein gültiges E-Mail-Format geprüft. Zahlenfelder werden auf numerische Eingaben geprüft. Pflichtfelder werden vor dem Absenden auf Inhalt geprüft. Auf der Serverseite bereinigt WEMASY alle Eingaben und entfernt HTML, JavaScript und anderen gefährlichen Code, bevor Einsendungen gespeichert werden. Du legst fest, welche Felder du erfassen willst, und WEMASY erledigt Validierung und Bereinigung im Hintergrund.
Auf der Preisseite siehst du, welche Formularfunktionen in deinem Tarif enthalten sind.