Anna Panama: Formulareingabe sicher machen

Hallo,

danke, dass du dir die Zeit nimmst, vorbeizuschauen!

Mich beschäftigt derzeit folgendes: Ich habe ein Eingabeformular, dessen Inhalt ich auf gewisse Zeichen beschränke, um möglichem Hacking vorzubeugen. Die Überprüfung des Inhalts erfolgt naturgemäß via Javascript, daher wird die durchzuführende Aktion des Formulars erst ausgelöst, nachdem der Inhalt auf seine Zulässigkeit hin überprüft wurde.

Was aber, wenn nun Javascript im Browser des Endbenutzers nicht aktiviert ist? Das Formular lässt sich mit ENTER immer noch auslösen, lässt aber nun keine Prüfung des Inhalts mehr zu!

Im Prinzip sehe ich zwei Optionen:

Option 1: ich könnte die gesamte Seite "verstecken" (display:none;) und mit Javascript erst anzeigen. Option 2: ich könnte <noscript> mit einer Weiterleitung versehen.

Beide Optionen erscheinen mir aber alles andere als sicher, da es

  1. durchaus möglich ist, eine Seite ohne deren style-Attribute anzuzeigen und
  2. auch eine Weiterleitung vor deren Durchführung "abgefangen" werden kann.

Da Javascript clientseitig und PHP serverseitig ausgeführt wird, sehe ich auch keine Möglichkeit, vielleicht per PHP Anweisungen zu geben, die Seite erst gar nicht zur Verfügung zu stellen, so Javascript deaktiviert ist.

Wie schütze ich mein Eingabeformular also auch bei deaktiviertem Javascript vor "falschen" Eingaben?

Danke!

LG, Anna.

  1. Hi,

    Ich habe ein Eingabeformular, dessen Inhalt ich auf gewisse Zeichen beschränke, um möglichem Hacking vorzubeugen.

    das ist als erste Stufe okay, aber gegen Hacker vergebliche Liebesmüh.

    Die Überprüfung des Inhalts erfolgt naturgemäß via Javascript, daher wird die durchzuführende Aktion des Formulars erst ausgelöst, nachdem der Inhalt auf seine Zulässigkeit hin überprüft wurde.

    Was aber, wenn nun Javascript im Browser des Endbenutzers nicht aktiviert ist? Das Formular lässt sich mit ENTER immer noch auslösen, lässt aber nun keine Prüfung des Inhalts mehr zu!

    Grundsätzlich sollte eine Seite auch ohne Javascript zumindest nutzbar sein, wenn auch vielleicht mit Komfort-Einbußen. Es ist also völlig okay, wenn das Formular so auch abgeschickt werden kann. Und das ist auch der Punkt, den ich im vorherigen Absatz schon angedeutet habe: Die Überprüfung mit Javascript kann nur eine Vorstufe sein, die den Vorzug bietet, dass ein fehlerhaft ausgefülltes Formular nicht erst abgeschickt werden muss, um den Fehler festzustellen.

    Die eigentliche Überprüfung muss daher auf dem Server stattfinden, an den die Formulardaten gesendet werden. Bedenke, dass auch ohne dein Formular formal korrekte Formulardaten gesendet werden könnten, etwa mit Tools wie wget oder curl. Oder indem jemand eine manipulierte Form des Formulars einfach nachbaut.

    Option 1: ich könnte die gesamte Seite "verstecken" (display:none;) und mit Javascript erst anzeigen.

    Option 2: ich könnte <noscript> mit einer Weiterleitung versehen.

    Also die Wahl zwischen Galgen und Guillotine gegen Kopfschmerzen.

    Beide Optionen erscheinen mir aber alles andere als sicher, da es

    1. durchaus möglich ist, eine Seite ohne deren style-Attribute anzuzeigen und
    2. auch eine Weiterleitung vor deren Durchführung "abgefangen" werden kann.

    Plus die schon erwähnte Möglichkeit, dass ein Datensatz komplett ohne Verwendung deines Formulars generiert und gesendet wird.

    Wie schütze ich mein Eingabeformular also auch bei deaktiviertem Javascript vor "falschen" Eingaben?

    Indem PHP die ankommenden Eingabedaten prüft, die zwar im Friedensfall schon okay sein sollten, aber auch beliebig fehlerhaft. In dem Fall musst du dich entscheiden, ob du einfach wieder das Formular anzeigst (-> Affenformular), oder einfach eine Fehlerseite, oder etwas ganz anderes.

    So long,
     Martin

    --
    Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
    - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    1. Wie schütze ich mein Eingabeformular also auch bei deaktiviertem Javascript vor "falschen" Eingaben?

      Indem PHP die ankommenden Eingabedaten prüft, die zwar im Friedensfall schon okay sein sollten, aber auch beliebig fehlerhaft. In dem Fall musst du dich entscheiden, ob du einfach wieder das Formular anzeigst (-> Affenformular), oder einfach eine Fehlerseite, oder etwas ganz anderes.

      Dank für die rasche Antwort!

      Ok, nur damit ich das richtig verstehe. Wenn ich die Eingabe "auffange", dann schließe ich diese Sicherheitslücke? z.B. gesetzt der Fall, es wären nur Ziffern zulässig:

      erste_Seite.php:

      <form name="formular" action="zweite_Seite.php" method="post">
      <input type="text" name="zugang" "/>
      </form>
      

      zweite_Seite.php:

      if (is_numeric($_POST["zugang"])) {
              // ZUGANG!
          } else {
              exit ("Ein Satz mit x - das war wohl nix");
          }
      }
      
      --
      The ships hung in the sky in much the same way that bricks don't.
      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      1. Tach!

        Wenn ich die Eingabe "auffange", dann schließe ich diese Sicherheitslücke? z.B. gesetzt der Fall, es wären nur Ziffern zulässig:

        Das ist keine Sicherheitslücke. Die Validierung auf bestimmte Werte ist eine Anforderung der Geschäftslogik. Nichtsdestotrotz muss die Prüfung auf gültige Werte da erfolgen, wo sie nicht umgangen werden kann, also mindestens auf dem Server.

        dedlfix.

      2. Hallo,

        Wie schütze ich mein Eingabeformular also auch bei deaktiviertem Javascript vor "falschen" Eingaben?

        Indem PHP die ankommenden Eingabedaten prüft, die zwar im Friedensfall schon okay sein sollten, aber auch beliebig fehlerhaft. In dem Fall musst du dich entscheiden, ob du einfach wieder das Formular anzeigst (-> Affenformular), oder einfach eine Fehlerseite, oder etwas ganz anderes.

        Wenn ich die Eingabe "auffange", dann schließe ich diese Sicherheitslücke?

        vermutlich ja. Überlege dir, woher die "Unsicherheit" kommt. Normalerweise doch daher, dass das Programm bei falschen (d.h. unerwarteten) Eingabedaten etwas Unvorhergesehenes tut, was man nicht möchte.

        z.B. gesetzt der Fall, es wären nur Ziffern zulässig:

        Meist würde zur Bedingung "nur Ziffern" auch noch ein bestimmter Wertebereich gehören, vielleicht "nur positiv", oder "ganzzahlig von 0..100". Übrigens macht is_numeric() mehr als auf "nur Ziffern" zu prüfen: Die Funktion überprüft, ob der Parameter als Zahlenwert interpretiert werden kann. Da würden also auch Vorzeichen, Dezimalpunkte, Präfixe für Hex-Notation oder die wissenschaftliche Schreibweise (1.08E+06) akzeptiert. Mach dir also den Unterschied zwischen "nur Ziffern" und "nur Zahlenwerte" klar, und überlege, was in deinem Fall tatsächlich richtiger ist.

        Ansonsten ist der Ansatz prinzipiell in Ordnung.

        The ships hung in the sky in much the same way that bricks don't.

        • Douglas Adams, The Hitchhiker's Guide To The Galaxy

        Oh, another hitchhiker! :-)
        Das ist einer der Sätze, die IMO in der deutschen Übersetzung viel vom ursprünglichen Sprachwitz verloren haben.

        So long,
         Martin

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      3. @@Anna Panama

        z.B. gesetzt der Fall, es wären nur Ziffern zulässig:

        Wenn du ein Eingabefeld für Zahlenwerte haben möchtest, dann nicht <input type="text">, sondern <input type="number">. Und schon senden HTML5-konforme Browser das Formular gar nicht ab, wenn etwas anderes eingegeben wurde – ganz ohne JavaScript.

        Auch das erspart natürlich nicht die serverseitige Prüfung.

        LLAP 🖖

        --
        “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        1. Hallo Gunnar Bittersmann, @Anna Panama

          Wenn du ein Eingabefeld für Zahlenwerte haben möchtest, dann nicht <input type="text">, sondern <input type="number">.

          Ergänzung: clientseitige Validierung von Formularen

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  2. Tach!

    Ich habe ein Eingabeformular, dessen Inhalt ich auf gewisse Zeichen beschränke, um möglichem Hacking vorzubeugen.

    Das ist nicht unbedingt der beste Weg. Was haben denn die Zeichen verbrochen, dass man sie ausschließen muss? Die Zeichen sind nicht der Übeltäter, auch nicht derjenige, der sie eingibt. Das Problem ist in der Regel der nicht beachtete Kontextwechsel.

    dedlfix.