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
Dies ist eine Option, über die ich nicht nachgedacht habe .. und ich kann nicht testen, weil ich am Gewinn bin – enkore
Es gibt eine Version kompiliert für win32 [hier] (http://gnuwin32.sourceforge.net/packages/ Datei.htm). –
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. –