Mons: PHP - Traue keiner Nutzereingabe (Filter und Entities) -> Was ist sinnvoll?

Hallo,

ich möchte gerne ein Textarea-Feld mit einem PHP Scirpt bearbeiten. Getreu dem Motto traue keinem Input den du nicht selbst geschrieben hast, möchte ich sicher stellen, das sich kein Ausführbarer Code darin befindet.

Meine Idee war ein:

filter_input(INPUT_POST, "message", FILTER_DEFAULT);

htmlentities

Habt Ihr vielleicht weitere Ideen?

  1. "ausführbarer Code" auf welchem System in welcher Sprache? PHP auf dem selber Server? SQL in der Datenbank? Javascript beim Client? Definier mal dein Zielsystem.

    1. Hallo,

      jap PHP auf dem gleichen Server, und der Datensatz wird zu Archivzwecken gespeichert (MYSQL). Der Nutzer bekommt die Ausgabe via PHP.

      1. Hi,

        ob es ausführbarer Code ist von davon abhänging, was du mit dem Input machst, dabei ist immer der Kontextwechsel zu beachten.

      2. Moin,

        jap PHP auf dem gleichen Server,

        dann darf die Eingabe des Nutzers nirgends ausgeführt werden, z.B. als Teil eines Regex, als Bestandteil in eval oder system, oder in einer Datei gespeichert werden, die per include eingebunden ist.

        und der Datensatz wird zu Archivzwecken gespeichert (MYSQL).

        Das Stichwort ist Kontextwechsel nach MySQL, damit gehst du am Besten um, indem du prepared statements verwendest.

        Der Nutzer bekommt die Ausgabe via PHP.

        Möglicherweise muss noch fürs Ausgabeformat maskiert werden, d.h. htmlspecialchars, wenn du HTML ausgibst.

        Viele Grüße
        Robert

      3. prinzipiell springt PHP ja erstmal auf alles an, was irgendwo "<?php" enthält, bzw. "<?" wenn short_open_tags aktiviert ist (in includes, oder wenn du das als Datei speicherst, oder im eval). Darauf kannst du einfach mit strpos prüfen. Ob du einen Syntaxcheck machen willst ist aber eine andere Frage.

        1. Moin,

          das Wenn würde ich stärker betonen. Denn IMHO gibt es keinen vernünftigen Grund, Nutzereingaben mit eval, include oder anderem zu verarbeiten.

          Viele Grüße
          Robert

          1. Nutzereingaben als Datei zu speichern ist ja üblich, vorallem bei Bilderuploads. Das ist ja nichts anderes als include/eval, wenn der Webserver das ausführen lassen will, man darf halt nicht vergessen das zu unterbinden.

            1. Moin chorn,

              Nutzereingaben als Datei zu speichern ist ja üblich, vorallem bei Bilderuploads. Das ist ja nichts anderes als include/eval,

              Ich hätte präzisieren sollen: readfile und echo statt include und eval. Es gibt ja schon noch einen Unterschied, ob ich etwas ausgebe oder ausführe.

              Viele Grüße
              Robert

  2. Tach!

    ich möchte gerne ein Textarea-Feld mit einem PHP Scirpt bearbeiten. Getreu dem Motto traue keinem Input den du nicht selbst geschrieben hast, möchte ich sicher stellen, das sich kein Ausführbarer Code darin befindet.

    Wenn es ein Leerstring ist, hast du garantiert keinen ausführbaren Code drin. Ansonsten müsstest du erstmal definieren, was ausführbarer Code ist.

    filter_input(INPUT_POST, "message", FILTER_DEFAULT);

    Das ist sinnlos, denn FILTER_DEFAULT ist FILTER_UNSAFE_RAW, und das filtert überhaupt nichts. Allgemein ist das Filtern am Eingang ziemlich sinnfrei, wenn das wegen Sicherheitsbedenken erfolgt und keine fachlichen Gründe vorliegen.

    Es gibt jedoch auf der Ausgangsseite eine ganze Menge Kontexte, in die man Daten einfügen muss, und für diese ist stets individuell zu betrachten, welche Zeichen maskiert werden müssen. Es gibt da kein universelles "sicher", abgesehen vom erwähnten Leerstring.

    htmlentities

    htmlspecialchars() ist die bessere Funktion, wenn es darum geht, einen HTML-Kontext zu beachten.

    Habt Ihr vielleicht weitere Ideen?

    Ansonsten geht der Artikel Kontextwechsel auf die Problematik ein und zeigt eine Menge Kontexte und wie man mit ihnen umgehen kann.

    dedlfix.