Mariee: Prüfen einer geuploadeten Datei

Hallo,
für die Sicherheit soll eine Datei, die mit einem input type="file" Feld hochgeladen wurde, geprüft werden.

Ich habe es bisher wie hier gemacht
http://aktuell.de.selfhtml.org/artikel/php/php-uploadcheck/

Nun will ich 2 Dateiarten zulassen. eine .txt und eine mit selbstdefinierten Ende (jetzt mal als .user).
Bei .txt teste ich:
$_FILES['fileName']['type']=="text/plain".

Für die .user habe ich noch nichts gefunden, wie ich es machen soll. Also habe ich es einfach mal probiert.
Wenn ich es vom Firefox absende wird es abeblockt, da in $_FILES['fileName']['type'] application/oxtet-strem steht.
Wenn ich es über Internet Explorer hochlade, geht es allerdings.

Wie prüfe ich am besten die hochgeladene Datei? In dem ich selber den Dateiname nehme, bei dem Punkt trenne und schaue, ob nach dem punkt "txt" oder "user" steht?

Danke für die Hilfe

  1. Hallo,

    prüfe einfach zunächstmal die Dateiendung, die wird dir ja im $_FILES-Array mitgeliefert.

    Da es sich ja um ein eigenes Textdatei-Format handelt, liegt es nahe, dass du mit den Daten dann auch was anfangen willst danach, richtig?

    Dann wäre es doch gut einen Plausiblitätstest zu machen. Also ob der Inhalt auch wirklich das ist, was man benötigt. Dann musst du dich nicht mit Dateitypen, die ja auch gefaked sien können, herumschlagen.

    Gruß
    Alex

  2. Hallo,

    für die Sicherheit soll eine Datei, die mit einem input type="file" Feld hochgeladen wurde, geprüft werden.

    Sehr gut.

    Nun will ich 2 Dateiarten zulassen. eine .txt und eine mit selbstdefinierten Ende (jetzt mal als .user).

    Achtung! Bitte nicht Dateinamen oder -endung mit dem Inhalt verwechseln bzw. von Einem auf das Andere Schließen.

    Bei .txt teste ich:
    $_FILES['fileName']['type']=="text/plain".

    Ein Blick ins Handbuch verrät: The mime type of the file, if the browser provided this information. An example would be "image/gif". This mime type is however not checked on the PHP side and therefore don't take its value for granted.

    Du musst dir also etwas anderes einfallen lassen. Ich würde file in Kombination mit shell_exec und escapeshellcmd vorschlagen. Aber bitte bitte auch hier höchste Vorsicht im Umgang mit Benutzereingaben (Dateiname, etc.) walten lassen.

    Wenn ich es vom Firefox absende wird es abeblockt, da in $_FILES['fileName']['type'] application/oxtet-strem steht.

    Genau. Siehe oben. Diese Angabe ist nicht verlässlich.

    Wie prüfe ich am besten die hochgeladene Datei?

    Das beste wäre, du überprüfst den Inhalt unabhängig vom Namen und Typ. Wenn das nicht geht, dann musst du sehr genau darauf achten, wie die vom potenziell bösen User hochgeladene Datei im System behandelt wird.
    Worst Case wäre, wenn die Datei Programmcode enthalten kann, der dann mit den Rechten des Webservers ausgeführt wird oder potenziell schädlicher Clientcode (JavaScript) bei einem anderen Benutzer angezeigt wird.

    In dem ich selber den Dateiname nehme, bei dem Punkt trenne und schaue, ob nach dem punkt "txt" oder "user" steht?

    NEIN!

    Grüße

    1. Hello,

      Worst Case wäre, wenn die Datei Programmcode enthalten kann, der dann mit den Rechten des Webservers ausgeführt wird oder potenziell schädlicher Clientcode (JavaScript) bei einem anderen Benutzer angezeigt wird.

      In dem ich selber den Dateiname nehme, bei dem Punkt trenne und schaue, ob nach dem punkt "txt" oder "user" steht?
      NEIN!

      Jein!
      Denn es ist immer noch besser, dort steht 'txt' oder 'user', als wenn dort 'php' oder 'pl' stehen würde oder sonst eine von den giftigen Endungen, die den Webserver veranlassen könnten, einen Parser oder die Script-Engine anzuschmeißen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo,

        In dem ich selber den Dateiname nehme, bei dem Punkt trenne und schaue, ob nach dem punkt "txt" oder "user" steht?
        NEIN!
        Jein!

        Nein! :-)

        Du hast natürlich Recht mit dem Webserver. Jedoch ist dieser Vorschlag unter dem Thema: "Prüfen einer geuploadeten Datei" gemacht worden und dafür ist das ganzlich ungeeignet.

        Grüße

  3. Hello,

    Bei .txt teste ich:
    $_FILES['fileName']['type']=="text/plain".

    Das solltest Du nicht tun.
    $_FILES['fileName']['type'] kommt vom Client und der lügt immer erstmal... ;-)

    Es ist doch etwas komplexer, als von Ludwig dargestellt.
    Ich kämpfe mich daher durch einen neuen Artikel. Er sit immer noch nicht ganz feritg, aber der Rumpf enthält zu den Gemeinheiten schon mehr wichtige Informationen, die Du berücksichtigen solltest.

    http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  4. Hallo,
    vielen lieben Dank für die Antworten.

    Ich werde es versuchen, best möglichst mit euren Hinweisen umzusetzen.

    "Da es sich ja um ein eigenes Textdatei-Format handelt, liegt es nahe, dass du mit den Daten dann auch was anfangen willst danach, richtig?"
    Es sind Konfigurationsdateien für ein Programm. In diesem File stehen nur Parameter drin, die später ausgelesen werden (die sind von einem Kollegen. Ich baue im Moment nur eine Präsentations-/Testanwendug, das ausschließlich bei uns im Intranet läuft - dennoch will ich eine bestimmte Sicherheit einbauen).

    Auf das Programm, das diese Konfigurationsdateien verwendet, habe ich keinen direkten Einfluss.
    Es parst allerdings die Datei Zeilen weiße, schaut ob bestimmte Parameter vorhanden sind und liest anschließend dessen Value aus (wieso es keine reine, echte xml-Datei ist, hat historische Gründe, die mit der Erstellung und Herkunft zu tun haben).