Frage

Ich bin etwas Programmierung, die es Benutzern, Dokumente und Bilder auf einem Webserver gespeichert werden können, gespeichert und später abgerufen werden. Wenn Benutzer Dateien auf meinen Server hochladen, sagt PHP mir, was es auf dem Dateityp Erweiterung basiert. Ich habe jedoch Angst, dass die Benutzer eine ZIP-Datei als somezipfile.png umbenennen könnte und speichern Sie es, so eine Zip-Datei auf meinem Server zu halten. Gibt es eine vernünftige Möglichkeit, um eine hochgeladene Datei und „check“ zu öffnen, um zu sehen, ob es wirklich den genannten Dateitypen ist?

War es hilfreich?

Lösung

Magic-Nummer . Wenn Sie ersten paar Bytes einer Binärdatei lesen kann, können Sie wissen, welche Art von Datei es sich handelt.

Andere Tipps

Schauen Sie sich die Fileinfo PECL-Erweiterung für PHP, die das tun kann, MIME-Magie-Lookups für Sie.

Eine Art. Die meisten Dateitypen haben einige Bytes reserviert für sie markiert, so dass Sie müssen auf der Verlängerung nicht verlassen. Die Website http://wotsit.org ist eine großartige Ressource dies, um herauszufinden, für einen bestimmten Typ.

Wenn Sie auf einem Unix-System sind, glaube ich, dass die Datei-Befehl nicht auf der Verlängerung angewiesen ist, so könnte man es berappen, wenn Sie wollen, um die Byte-Prüfcodes nicht schreiben.

Für PNG ( http://www.w3.org/TR/PNG- Rationale.html )

Die ersten acht Bytes einer PNG-Datei enthält immer die folgenden Werte:

(dezimal) 137 80 78 71 13 10 26 10

(hexadezimal) 89 50 4e 47 0D 0A 0A 1a

(ASCII C-Notation) \ 211 P N G \ r \ n \ 032 \ n

Wenn Sie nur mit Bildern zu tun, dann getimagesize () sollte ein gültiges Bild von einer Fälschung eines unterscheiden.

$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
  [0]=>
  int(200)
  [1]=>
  int(200)
  [2]=>
  int(2)
  [3]=>
  string(24) "width="200" height="200""
  ["bits"]=>
  int(8)
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(10) "image/jpeg"
}

$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)

Ein falscher Wert von getimagesize ist kein Bild.

Viele Dateitypen haben „ magischen Zahlen “ am Anfang der Datei, sie zu identifizieren, Sie können einige Bytes von der Vorderseite der Datei lesen und vergleichen sie mit einer Liste bekannter magischen Zahlen.

Auf einem Unix-System-Befehl die Ausgabe von dem ‚Datei‘ der Erfassung sollte ausreichend Informationen zur Verfügung stellen.

Für eine genaue Antwort, wie Sie dies in PHP schnell tun können, lesen Sie in dieser Frage: Wie finde ich den MIME-Typen eine Datei mit php?

Als Randbemerkung ich in ein ähnliches Problem lief, wo ich musste meine eigene Typprüfung tun. Die Front-End-Schnittstelle zu meiner Anwendung wurde in Flash gemacht. Die Dateien wurden durch Flash an ein PHP-Skript übergeben. Als ich versuchte, einen MIME-Typ Prüfung zu tun mit PHP die Art immer wieder war application / octetstream, weil es aus dem Flash kommen würde.

Ich hatte ein magische Zahl Art Paradigma zu implementieren. Ich habe einfach eine XML-Datei, die den Dateityp zusammen mit einigen definieren Mustern gehalten innerhalb des Anfangs der Datei gefunden. Sobald die Datei auf den Server erreicht habe ich einige Muster mit der XML-Datei passend und dann akzeptiert oder die Datei abgelehnt. Ich habe keine wirkliche Leistung entweder bemerkt zu verringern, was ich erwartet hatte.

Das ist nur eine Randnotiz für jeden, der mit Blitz werden kann, wie es Front-End und versuchen die Datei eingeben prüfen, sobald es hochgeladen wird.

Neben den Dateityp zu identifizieren, können Sie eingebettete Dateien mit anderen Dateien achten oder sie angehängt. Dies wird leider eine vertiefende Analyse der Dateiinhalte erfordert als nur mit „magischen Zahlen“.

Zum Beispiel: http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (diese besondere Art von Daten versteckt leicht bearbeitet werden kann um von Laden und erneuten Speichern in eine neue Datei die eigentlichen Daten Bild .. andere schwieriger sein wird.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top