.rar,.type MIME des fichiers zip

je suis en train de développer un script de téléchargement php simple, et les utilisateurs ne peuvent télécharger que des fichiers ZIP et RAR.

Quels types de MIME je devrais utiliser pour vérifier $_FILES[x][type] ? (une liste complète s'il vous plaît)

Merci..

113
demandé sur mrdaliri 2011-08-08 07:45:57

4 réponses

Les réponses de freedompeace, Kiyarash et Sam Vloeberghs:

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

je vérifierais aussi le nom du fichier. Voici comment vous pouvez vérifier si le fichier est un RAR ou un fichier ZIP. Je l'ai testé en créant rapidement une application en ligne de commande.

<?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"151910920"3"151910920"4, PK"151910920"5"151910920"6 (empty archive), 
    // or PK"151910920"7"151910920"8 (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;
}

remarquez qu'il ne sera toujours pas certain à 100%, mais il est probablement assez bon.

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

mais même WinRAR détecte des fichiers non-RAR comme archives SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr
194
répondu Gfy 2018-05-29 17:55:45

Pour télécharger:

une liste officielle des types mime se trouve à the Internet Assigned Numbers Authority (IANA) . Selon leur liste Content-Type en-tête pour zip est application/zip .

le type de média pour les fichiers rar n'est pas officiellement enregistré à L'IANA, mais la valeur non officielle de type mime est application/x-rar-compressed .

application/octet-stream signifie autant que: "je vous envoie un flux de fichier et le contenu de ce flux n'est pas spécifié" (il est vrai qu'il peut être un zip ou rar fichier). Le serveur est censé détecter le contenu réel du flux.

Note: pour le téléchargement il n'est pas sûr de se fier au type mime défini dans l'en-tête Content-Type . L'en-tête est réglé sur le client et peut être réglé à une valeur aléatoire. Au lieu de cela, vous pouvez utiliser le fichier php info fonctions permettant de détecter le fichier mime-type sur le serveur.


Pour le téléchargement:

si vous souhaitez télécharger un fichier zip et rien d'autre, vous ne devez définir qu'une seule valeur d'en-tête Accept . Tout jeu de valeurs supplémentaires sera utilisé comme repli au cas où le serveur ne pourrait pas satisfaire votre type mime dans l'en-tête Accept demandé.

Selon le WC3 spécifications ce:

application/zip, application/octet-stream 

sera intrepreted comme: "je préfère un application/zip mime-type, mais si vous ne pouvez pas livrer ce application/octet-stream (un flux de fichier) est également très bien".

Donc, un seul:

application/zip

vous garantit un fichier zip (ou une réponse 406 - Not Acceptable si le serveur n'est pas en mesure de satisfaire votre demande).

23
répondu Wilt 2015-08-26 08:01:01

vous ne devez pas faire confiance à $_FILES['upfile']['mime'] , vérifiez le type MIME par vous-même. Pour cela , vous pouvez utiliser fileinfo extension , activé par défaut depuis 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.');

NOTE: n'oubliez pas d'activer l'extension dans votre php.ini et de redémarrer votre serveur:

extension=php_fileinfo.dll
4
répondu fibriZo raZiel 2015-11-06 13:31:23

comme extension peut contenir plus ou moins que trois caractères, ce qui suit sera test pour une extension quelle que soit sa longueur.

essayez ceci:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

pour vérifier tous les caractères après le dernier".

-1
répondu theking2 2015-03-27 16:12:09