2012-04-08 7 views
6

Ich arbeite an einem Upload-Formular in PHP, das nur MP3-Dateien zulassen darf.ist die Mime-Typ-Erkennung der beste Weg, um eine Art von Datei zu erkennen?

Wenn der Upload fertig ist, analysiere ich die Datei, um zu prüfen, ob es wirklich ein mp3 ist. Der erste Schritt besteht darin, den Mime-Typ als "audio/mpeg" zu erkennen, ich benutze die Bibliotheken finfo_file() und funktioniert gut die Tests einige mp3 werden zurückgewiesen, weil ihre Mimetypresultate als: application/octet-stream

meine Fragen sind: - sollte meine APP definitiv diese mp3 ablehnen? sie spielen tatsächlich Audio - gibt es irgendeinen Grund, warum dieser Mime-Typ ein mp3 ist? - ist die Erkennung von MIME-Typ der sicherste Weg, um die Art der Datei zu wissen?

Antwort

0

Wenn Sie eine extrem robuste Methode zum Erkennen von Dateitypen verwenden möchten, ohne dem Client nur den korrekten MIME-Typ zuzuweisen, verwenden Sie das Dienstprogramm file unter UNIX.

$ file Black\ Sands\ 01\ Prelude.mp3 
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo 

$ file homework/math475-hw8.docx 
homework/math475-hw8.docx: Microsoft Word 2007+ 

In PHP können Sie die Funktion exec es aufzurufen verwenden.

+0

Dies ist eine Option, über die ich nicht nachgedacht habe .. und ich kann nicht testen, weil ich am Gewinn bin – enkore

+0

Es gibt eine Version kompiliert für win32 [hier] (http://gnuwin32.sourceforge.net/packages/ Datei.htm). –

+0

Der Befehl 'file' und die' finfo_file' -Funktion von PHP verwenden die gleichen Methoden zur Bestimmung des MIME-Typs (normalerweise durch Verweisen auf '/ usr/share/misc/magic'). Dann nützt es nichts, 'exec file' zu ​​benutzen, wenn Sie eine eingebaute Funktion haben. Allerdings habe ich hier einen Fall, in dem eine '.mp3' von' finfo_file' und 'file -I' als' application/octet-stream' erkannt wird, wenn ich erwarte, dass sie 'audio/mpeg' zurückgibt. Beide versagen. Ich denke jedoch, dass dies gelöst werden kann, indem der Pfad zu einer verbesserten 'magic' Datei als zweites Argument zu' finfo_open' übergeben wird. –

0

Die beste Methode zur Dateierkennung ist die Verwendung des "Magic Byte" - oder "Magic Number" -Schemas zusätzlich zu MIME. Unix file (sowie finfo_file) verwendet tatsächlich "magische Bytes", um diese Dateierkennung durchzuführen. Kurz gesagt: ja.

Sorgen Sie sich nicht so sehr darum, wie Ihre Datei aussieht, und darüber, was Sie damit machen können. Solange es abgespielt wird, sollte die Datei in Ordnung sein.

Wenn Sie wirklich mehr tun möchten, können Sie selbst nach den magischen Bytes suchen. Es gibt a list of them here.

+0

das ist, warum mit getid3() Klasse bekomme ich "audio/mpeg" aber mit finfo_filei bekommen "application/octet-stream" auf der gleichen Datei .. das ist ein bisschen seltsam .. aber auch wenn die Datei abspielbar ist, wenn Ergebnisse mit einem anderen Mime-Typ wird es aus Sicherheitsgründen abgelehnt (es sei denn, ich finde einen besseren Weg) .. Ich frage mich, wie viele mp3s haben keine korrekte Pantomime .. – enkore

+1

@enkore "Ich frage mich, wie viele mp3s haben keine richtige Pantomime "Der MIME-Typ wird vom Client bereitgestellt. Es ist nicht in der mp3-Datei selbst inhärent. –

2

In den meisten meiner Anwendungen, für die ein Upload erforderlich ist, begnüge ich mich manchmal mit der Validierung des vom Browser (Client) übergebenen MIME mit einer Liste vordefinierter MIME-Typen. Dieser Ansatz geht davon aus, dass, wenn etwas Verdächtiges passiert, wo der Browser den MIME-Typ einer Datei, die hochgeladen wird, nicht kommunizieren kann, ich wahrscheinlich nicht die Mühe haben möchte, sie zu diesem Zeitpunkt zu verarbeiten.

<?php 

$valid_mp3_mimes = array(
    'audio/mpeg', 
    'audio/x-mpeg', 
    'audio/mp3', 
    'audio/x-mp3', 
    'audio/mpeg3', 
    'audio/x-mpeg3', 
    'audio/x-mpeg-3', 
    'audio/mpg', 
    'audio/x-mpg', 
    'audio/x-mpegaudio', 
    'video/mpeg', 
    'video/x-mpeg', 
); 

$uploaded_file_mime = $_FILES['upload_field_name']['type']; 

if(!in_array($uploaded_file_mime, $valid_mp3_mimes)) 
{ 
    die('Upload is not a valid MP3 file.'); 
} 

Sie können oder nicht fühlen, dass dies eine ausreichende Methode für Ihre Zwecke ist. Das PHP-Handbuch gibt ausdrücklich an, dass diese Information verfügbar ist , wenn der Browser diese Information zur Verfügung stellt und dass der MIME-Typ auf der Serverseite NICHT überprüft wird und daher nicht als selbstverständlich betrachtet werden sollte.

Eine Sache, die berücksichtigt werden muss, ist die Verfügbarkeit von Ressourcen auf dem Server, mit denen Sie den wahren MIME-Typ einer Datei authentifizieren können.

Als PHP-Entwickler lieben wir die Flexibilität, plattformunabhängigen Code größtenteils zu erstellen (z. B. können unsere Webanwendungen, die auf einem Windows-System mit XAMPP basieren, in einer Linux-Hosting-Umgebung mit wenig Modifikationen implementiert werden). Bei der Validierung von MIME-Typen beginnen wir jedoch mit der Einführung plattformabhängiger Methoden, bei denen die Existenz dieser Tools überprüft werden muss (z. B. "Datei" oder "finfo_file").

Diese eine Implementierung wert sein könnte studieren (aus dem CodeIgniter GitHub-Repository), die diese Tools und ist etwa so gründlich von einem Arbeitsbeispiel verwendet, wie Sie im Rahmen von PHP zu bekommen sind:

Der Datei-MIME-Typ erkennt den (tatsächlichen) MIME-Typ der hochgeladenen Datei, falls möglich. https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983


Quellen

PHP Manual POST-Methode Uploads - http://www.php.net/manual/en/features.file-upload.post-method.php

Webmaster Toolkit Mime-Typen - http://www.webmaster-toolkit.com/mime-types.shtml

FILExt MP3-Datei - http://filext.com/file-extension/MP3