Datenvalidierung

Datenvalidierung in der Softwaretechnik bezeichnet die Prüfung von beispielsweise Benutzereingaben. Weil fehlende oder unbrauchbare Eingaben zu schwerwiegenden Fehlern innerhalb eines Programms führen können, sollten diese Werte vor einer Übernahme in ein Programm validiert werden.

Validierung als Plausibilitätsprüfung

Validierung versteht sich als Test auf Plausibilität (englisch Sanity Check), bei dem ein konkreter Wert darauf geprüft wird, ob er zu einem bestimmten Datentyp gehört oder in einem vorgegebenen Wertebereich oder einer vorgegebenen Wertemenge liegt. Viele Programmfehler und Sicherheitsprobleme sind auf fehlende Plausibilisierung von Eingabewerten zurückzuführen.

Für die Validierung gilt die goldene Regel: never trust the user ‚traue niemals dem Benutzer (auch: Never trust a user input ‚traue niemals einer Benutzereingabe‘). Die Validierung von Werten kann an verschiedenen Punkten der Lebenszeit einer Software stattfinden:

  • Im Entwicklungsprozess: Während das Programm entsteht, sollten regelmäßig die einzelnen Funktionen und Module so genannten Unit-Tests unterzogen werden, die den Quellcode flächendeckend (Code Coverage Analysis) auf korrektes Verhalten überprüfen.
  • Bei der Übersetzung des Programmes: Einige Arten der Validierung können bereits von dem Compiler vorgenommen werden, insbesondere die Typsicherheit.
  • Durch die Laufzeitumgebung: Viele Programmiersprachen haben ein Laufzeitsystem, das bestimmte Arten von Fehlern selbständig erkennt; insbesondere der Zugriff auf nicht vorhandene Objekte wird von vielen modernen Systemen erkannt.
  • Zur Laufzeit: Alle Funktionen und Module sollten defensiv umgesetzt sein, sich also nicht darauf verlassen, dass sie korrekt verwendet werden. Das heißt, sie sollten, wenn sie mit falschen Parametern verwendet werden, sofort einen Fehler melden statt komplizierte Folgefehler zu riskieren (es gilt die Faustregel: Fail-Fast ‚schneller Abbruch‘). Hierfür eignet sich vor allem das Konzept der Ausnahmebehandlung. Bei falschen Parameterwerten, die nach Ansicht des Programmierers „eigentlich nie vorkommen dürfen“, kommen Assertions zum Einsatz.
  • Bei Benutzereingaben: hier gilt der Grundsatz „was sich überprüfen lässt, wird auch überprüft“. Bei ungültigen Eingaben wird die Fehlerbehandlung gestartet, eine Fehlermeldung ausgegeben und die Verarbeitung abgelehnt. Bei zweifelhaften Eingaben kann eine Warnung oder eine Bitte um Überprüfung durch den Anwender ausgegeben werden.

Einsatzgebiete

  • Die Eingaben von Online-Formularen sollten grundsätzlich validiert werden, um Sicherheitsrisiken auszuschließen.
  • Bei XML-Daten werden Elemente gegenüber einem Schema überprüft. Schlägt diese Überprüfung fehl, gelten die XML-Daten als nicht valide.

Beispiel für das Validieren von Benutzereingaben in PHP

Werden Eingaben eines Benutzers nicht validiert, kann es im weiteren Programmverlauf zu Fehlern kommen.

Hier ein Beispiel für ein PHP-Skript, welches Formulardaten via HTTP-POST empfängt und die erste Zahl durch die zweite dividiert:

$zahl1 = $_POST['zahl1'];
$zahl2 = $_POST['zahl2'];
echo $zahl1 / $zahl2;

Hier hat der Entwickler einige mögliche Fehlerquellen nicht bedacht:

  • Es kommt zu einem unerwarteten Ergebnis, wenn der Benutzer eines der beiden Textfelder nicht ausgefüllt hat
  • Ebenso darf der Benutzer nur Zahlen in das Textfeld einfügen, da PHP aufgrund seiner dynamischen Typisierung den String womöglich falsch interpretiert
  • Beträgt der Wert in zahl2 '0', schlägt die Division fehl (Teilen durch 0 nicht möglich)

Unter Aspekten der Prüfung müssen diese Punkte also ausgeschlossen werden, um ein fehlerfreies Arbeiten zu ermöglichen:

if(isset($_POST['zahl1']) && isset($_POST['zahl2'])) { // Sind überhaupt beide Textfelder ausgefüllt?
    $zahl1 = $_POST['zahl1'];
    $zahl2 = $_POST['zahl2'];

    if(is_numeric($zahl1) && is_numeric($zahl2)) { // Sind beide Angaben numerisch?
        if($zahl2 != 0) {  // Ist zahl2 ungleich 0 ?
            echo $zahl1 / $zahl2;
        } else {
            echo 'Teilen durch 0 unmöglich!';
        }
    } else {
        echo 'Beide Felder dürfen nur Zahlen enthalten';
    }
} else {
    echo 'Bitte füllen Sie beide Textfelder aus';
}

Beispiel für Orthogonale Validierung in Perl

Um den Programmieraufwand zu reduzieren und den Code übersichtlicher zu gestalten, kann man die Prüfungen und die daraus resultierenden Fehlermeldungen/Exceptions auslagern.

Perl Code ohne Validierung:

sub division {
  my $zahl1 = shift;
  my $zahl2 = shift;

  return $zahl1 / $zahl2;
}

Unter Einsatz eines Validierungsframeworks, hier Scalar::Validation,[1] muss der Code für eine vollständige Validierung nur geringfügig erweitert werden:

use MyValidation;

sub division {
  my $zahl1 = validate (zahl1 => Zahl        => shift);
  my $zahl2 = validate (zahl2 => ZahlNotZero => shift);

  return $zahl1 / $zahl2;
}

Ist zahl1 ein String, eine Referenz oder undef und damit keine Zahl oder zahl2 == 0, erzeugen die angegebenen Regeln (Rules) Zahl oder ZahlNotZero eine entsprechende Ausnahme/Fehlermeldung. Was genau passiert, kann im Framework konfiguriert werden und muss den Entwickler hier nicht interessieren. Wichtig ist nur, dass der weitere Programmablauf vor der return-Anweisung gestoppt wird.

Die Regeln können irgendwo definiert und getestet werden, sie können z. B. auch aus einer Datenbank stammen oder erst zur Laufzeit definiert werden: Die Regel Zahl könnte für einen Integer, eine Gleitkommazahl, eine Rationale Zahl oder eine Komplexe Zahl stehen. Das ist hier nicht näher spezifiziert.

Siehe auch

  • Eingabeprüfungen in PHP
  • Daniel Sentker: Der richtige Schutz vor Cross-Site-Scripting mit PHP. Shift Blog, 3. Februar 2011, archiviert vom Original am 4. April 2015; abgerufen am 22. Februar 2017 (Beispiel für Gefahrenquellen von nichtvalidierten Eingaben).

Einzelnachweise

  1. Scalar::Validation