Matt: Mime-Type bei Upload

Hallo,

bisher überprüfe ich hochgeladene Dateien auf Ihre Endung indem ich die letzten Buchstaben des Dateinamens checke und seit kurzem auch den Mime-Type der hochgeladenen Datei.

Es sollen nur PDFs hochgeladen werden können.

Das Problem:

Mache ich aus einem Word-Dokument (test.doc) ein PDF (umbenennen in test.pdf) lädt das Script es trotzdem hoch und verarbeitet es, obwohl nur die Dateiendung geändert wurde und es sich dabei nicht um ein PDF handelt.
Der Mime-Type wird auch hier als "application/pdf" angegeben - was ja eigentlich nicht sein kann. Oder wird der Mime-Type vom Browser gesendet?

Wie kann ich dieses Problem umgehen? Gibt es eine Funktion um den wirklichen Dateityp zur ermitteln?

Viele Grüße

  1. Wie kann ich dieses Problem umgehen? Gibt es eine Funktion um den wirklichen Dateityp zur ermitteln?

    Eine unsaubere Variante wäre die Datei auszulesen und die ersten 4 Buchstaben zu überprüfen, steht dort %PDF, ist es ein PDF ansonsten nicht.

    Gibt es andere performantere Lösungen? z.b. mittels einer Extension oder ähnliches?

    Danke

    1. Hi,

      Eine unsaubere Variante wäre die Datei auszulesen und die ersten 4 Buchstaben zu überprüfen, steht dort %PDF, ist es ein PDF ansonsten nicht.

      ich finde das durchaus nicht unsauber. Der - vom Browser gesendete - Mime-Type sagt, ist Du selbst festgestellt hast nur ein Anhaltspunkt. Du musst also den Dateiinhalt prüfen.
      Natürlich können auch nicht-PDFs mit %PDF beginnen, aber das dürfte eher selten vorkommen, zumal wenn der Dateiname auf .pdf endet.

      freundliche Grüße
      Ingo

      1. Hallo Ingo und alle anderen die auf eine performatere Lösung warten.

        Ich mache es jetzt so:

        Extension magic mime und fileinfo benötigt.

          
        $handle = finfo_open(FILEINFO_MIME, 'C:\Server\Xampp\php\extras\magic');  
        $mime_type = finfo_file($handle, $dateiname);  
        
        

        Wenn $mime_type nun nicht application/pdf ist, handelt es sich auch _wirklich nicht_ um ein PDF.

        Grüße

        1. Hello,

          Hallo Ingo und alle anderen die auf eine performatere Lösung warten.

          Ich mache es jetzt so:

          Extension magic mime und fileinfo benötigt.

          Die Extension magic_mime ist inzwischen als sehr unzuverlässig bekannt geworden.
          Da war die alte Funktion in PHP noch wesentlich zuverlässiger.

          Wenn man zusätzlich sicherstellen wollte, dass das File garantiert _kein_ Executable sein sollte, hat man es noch auf ASCII 0 durchsucht. Ein Executable hat garantiert irgendwo eine. Ich kenne jedenfalls keines ohne.

          Ein harzliches Glückauf

          Tom vom Berg

          http://bergpost.annerschbarrich.de
          .

          --
          Nur selber lernen macht schlau
          1. Hi,

            Wenn man zusätzlich sicherstellen wollte, dass das File garantiert _kein_ Executable sein sollte, hat man es noch auf ASCII 0 durchsucht. Ein Executable hat garantiert irgendwo eine. Ich kenne jedenfalls keines ohne.

            Und ein PDF hat garantiert keins? (k.A.)

            Und bei Bildern o.ae. haeltst du das auch fuer brauchbar?

            MfG ChrisB

            1. Hello,

              Wenn man zusätzlich sicherstellen wollte, dass das File garantiert _kein_ Executable sein sollte, hat man es noch auf ASCII 0 durchsucht. Ein Executable hat garantiert irgendwo eine. Ich kenne jedenfalls keines ohne.

              Und ein PDF hat garantiert keins? (k.A.)

              Und bei Bildern o.ae. haeltst du das auch fuer brauchbar?

              Habe ich das gesagt? Mach aus meiner Aussage nicht unerlaubter Weise eine umkehrbare.
              Ich habe lediglich gesagt, dass ein Executable (compiliertes Programmstück) garantiert irgendwo eine 0 enthält. Darüber hinaus gibt es ja auch noch genügend Arten von Scripten, die hier gefährlich werden können, also Programmtexte, die noch interpretiert werden müssen.

              Die gute alte MIMEMAGIC-Funktion war auf jeden Fall verlässlicher als die neue Klasse.

              http://www.php.net/manual/en/function.mime-content-type.php

              http://forum.de.selfhtml.org/archiv/2007/12/t163692/#m1066040
              wobei man an den Rückgabe werten der Funktion noch schnitzen sollte.
              Vielleicht ein Bitmuster zurückgeben? Oder ein Array?

              Ein harzliches Glückauf

              Tom vom Berg

              http://bergpost.annerschbarrich.de

              --
              Nur selber lernen macht schlau
              1. Hallo Tom,

                Die gute alte MIMEMAGIC-Funktion war auf jeden Fall verlässlicher als die neue Klasse.
                http://www.php.net/manual/en/function.mime-content-type.php

                inwiefern? Die PHP-Leute sind ja anderer Ansicht. [1]

                http://forum.de.selfhtml.org/archiv/2007/12/t163692/#m1066040

                Freundliche Grüße

                Vinzenz

                [1] Hatte ich das nicht schon einmal gefragt?

                1. Hello,

                  Die gute alte MIMEMAGIC-Funktion war auf jeden Fall verlässlicher als die neue Klasse.
                  http://www.php.net/manual/en/function.mime-content-type.php

                  inwiefern? Die PHP-Leute sind ja anderer Ansicht. [1]

                  http://forum.de.selfhtml.org/archiv/2007/12/t163692/#m1066040

                  Sei bitte so nett, und recherchiere da mal selber in Google und hier im Archiv. Es gibt diverse Links zu Veröffentlichungen, die etliche Fehler aufzeigen. Einige davon habe ich Ende letzten Jahres selber ausprobiert, weil ich es nicht glauben wollte. Es ist unverantwortlich von den PHP-Leuten, dass man sowas propagiert.

                  Ein harzliches Glückauf

                  Tom vom Berg

                  http://bergpost.annerschbarrich.de
                  .

                  --
                  Nur selber lernen macht schlau
            2. Hi,

              Und ein PDF hat garantiert keins? (k.A.)

              hat es.

              freundliche Grüße
              Ingo