it-swarm.com.de

.rar, .Zip-Dateien MIME-Typ

Ich entwickle ein einfaches PHP-Upload-Skript, und Benutzer können nur ZIP- und RAR-Dateien hochladen.

Welche MIME-Typen sollte ich verwenden, um $_FILES[x][type] zu überprüfen? (eine vollständige Liste bitte)

Vielen Dank..

120
mrdaliri

Die Antworten von freedompeace, Kiyarash und Sam Vloeberghs:

.rar    application/x-rar-compressed, application/octet-stream
.Zip    application/Zip, application/octet-stream, application/x-Zip-compressed, multipart/x-Zip

Ich würde auch den Dateinamen überprüfen. So können Sie überprüfen, ob es sich bei der Datei um eine RAR- oder Zip-Datei handelt. Ich habe es getestet, indem ich eine schnelle Befehlszeilenanwendung erstellt habe.

<?php

if (isRarOrZip($argv[1])) {
    echo 'It is probably a RAR or Zip file.';
} else {
    echo 'It is probably not a RAR or Zip file.';
}

function isRarOrZip($file) {
    // get the first 7 bytes
    $bytes = file_get_contents($file, FALSE, NULL, 0, 7);
    $ext = strtolower(substr($file, - 4));

    // RAR magic number: Rar!\x1A\x07\x00
    // http://en.wikipedia.org/wiki/RAR
    if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
        return TRUE;
    }

    // Zip magic number: none, though PK\003\004, PK\005\006 (empty archive), 
    // or PK\007\008 (spanned archive) are common.
    // http://en.wikipedia.org/wiki/Zip_(file_format)
    if ($ext == '.Zip' and substr($bytes, 0, 2) == 'PK') {
        return TRUE;
    }

    return FALSE;
}

Beachten Sie, dass es immer noch nicht zu 100% sicher ist, aber es ist wahrscheinlich gut genug.

$ rar.exe l somefile.Zip
somefile.Zip is not RAR archive

Aber auch WinRAR erkennt Nicht-RAR-Dateien als SFX-Archive:

$ rar.exe l somefile.srr
SFX Volume somefile.srr
210
Gfy

Für das Hochladen:

Eine offizielle Liste der MIME-Typen finden Sie unter The Internet Assigned Numbers Authority (IANA) . Entsprechend ihrer Liste ist Content-Type der Header für Zipapplication/Zip.

Der Medientyp für rar-Dateien ist nicht offiziell bei IANA registriert, der inoffizielle, häufig verwendete Wert für den Mime-Typ ist application/x-rar-compressed.

application/octet-stream bedeutet soviel wie: "Ich sende Ihnen einen Dateistream und der Inhalt dieses Streams ist nicht angegeben" (also kann es auch eine Zip- oder rar-Datei sein). Der Server soll erkennen, was der tatsächliche Inhalt des Streams ist. 

Hinweis: Beim Hochladen ist es nicht sicher, sich auf den Mimetyp zu verlassen, der im Content-Type-Header festgelegt ist. Der Header wird auf dem Client festgelegt und kann auf einen beliebigen Wert gesetzt werden. Stattdessen können Sie die PHP-Datei info verwenden, um den Dateimime-Typ auf dem Server zu ermitteln. 


Zum Download:

Wenn Sie eine Zip-Datei herunterladen möchten und nichts anderes, sollten Sie nur einen einzelnen Accept-Header-Wert festlegen. Alle zusätzlichen Werte werden als Fallback verwendet, falls der Server Ihren im Accept-Header angeforderten Mime-Typ nicht erfüllen kann.

Entsprechend den WC3-Spezifikationen dies: 

application/Zip, application/octet-stream 

wird dargestellt als: "Ich bevorzuge einen application/Zip-Mime-Typ, aber wenn Sie dies nicht liefern können, ist ein application/octet-stream (ein Dateistream) ebenfalls in Ordnung".

Also nur ein einziger:

application/Zip

Garantiert eine Zip-Datei (oder eine 406 - Not Acceptable-Antwort, falls der Server Ihre Anfrage nicht erfüllen kann).

26
Wilt

Sie sollten $_FILES['upfile']['mime'] nicht vertrauen, überprüfen Sie den MIME-Typ selbst. Zu diesem Zweck können Sie fileinfo extension verwenden, standardmäßig aktiviert ab PHP 5.3.0.

  $fileInfo = new finfo(FILEINFO_MIME_TYPE);
  $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
  $validMimes = array( 
    'Zip' => 'application/Zip',
    'rar' => 'application/x-rar',
  );

  $fileExt = array_search($fileMime, $validMimes, true);
  if($fileExt != 'Zip' && $fileExt != 'rar')
    throw new RuntimeException('Invalid file format.');

HINWEIS: Vergessen Sie nicht, die Erweiterung in Ihrem php.ini zu aktivieren und den Server neu zu starten:

extension=php_fileinfo.dll
4
fibriZo raZiel

In eine verknüpfte Frage gibt es einen Objective-C-Code, um den Mime-Typ für eine Datei-URL abzurufen. Ich habe eine Swift-Erweiterung erstellt, die auf diesem Objective-C-Code basiert, um den Mime-Typ zu erhalten:

import Foundation
import MobileCoreServices

extension URL {
    var mimeType: String? {
        guard self.pathExtension.count != 0 else {
            return nil
        }

        let pathExtension = self.pathExtension as CFString
        if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
            guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
                return nil
            }
            return mimeType.takeRetainedValue() as String
        }

        return nil
    }
}
0