Question

Sur le site Web de PHP, la seule vérification qu'ils suggèrent consiste à utiliser is_uploaded_file () ou move_uploaded_file () , ici . Bien sûr, vous ne voulez généralement pas que l'utilisateur charge n'importe quel type de fichier, pour diverses raisons.

Pour cette raison, j’ai souvent utilisé des méthodes "strictes". vérification de type mime. Bien sûr, cela est très imparfait, car les types mime sont souvent incorrects et les utilisateurs ne peuvent pas télécharger leur fichier. Il est également très facile de simuler et / ou de changer. Et avec tout cela, chaque navigateur et système d’exploitation les traite différemment.

Une autre méthode consiste à vérifier l’extension, qui est bien sûr encore plus facile à modifier que le type mime.

Si vous ne souhaitez que des images, utilisez quelque chose comme getimagesize () .

Qu'en est-il des autres types de fichiers? PDF, documents Word ou fichiers Excel? Ou même des fichiers texte seulement?

Modifier: si vous n'avez pas de mime_content_type ou Fileinfo et system (" fichier - bi $ uploadfile ") vous donne un type de fichier incorrect, quelles sont les autres options?

Était-ce utile?

La solution

Consultez mime_content_type ou Fileinfo . Ce sont des commandes PHP intégrées pour déterminer le type d'un fichier en examinant son contenu. Vérifiez également les commentaires sur les deux pages ci-dessus, il y a quelques autres bonnes suggestions.

Personnellement, j’ai eu de la chance en utilisant quelque chose qui est essentiellement un système ("fichier -bi $ uploadfile") , mais je ne suis pas sûr que ce soit la meilleure méthode.

Autres conseils

IMHO, toutes les méthodes de vérification de type MIME sont inutiles.

Dites que vous avez ce qui devrait avoir le type MIME application / pdf . Les méthodes standard essaient de trouver quelque chose qui ressemble à un en-tête PDF (% PDF - ou similaire, etc.) et elles renverront «OK, cela ressemble à un fichier PDF» en cas de succès. Mais en fait, cela ne veut rien dire. Vous pouvez télécharger un fichier contenant uniquement % PDF-1.4 et il réussira le contrôle MIME.

Je veux dire si le fichier a un type MIME attendu - la vérification du type MIME sera toujours réussie, sinon le résultat n'est pas défini.

Je suppose que vous allez avoir une liste blanche fixe de types de fichiers que vous accepterez.

Pour chacun de ces types, vous allez devoir utiliser différentes techniques pour vérifier qu'il s'agit d'exemples valides de ce format.

Il y a deux questions liées:

  • Cela donne-t-il à peu près le type qui convient? (Pour JPEG, vous pouvez vérifier les en-têtes, comme vous l'avez mentionné. Pour de nombreux formats basés sur Unix, vous pouvez également cocher le "cookie magique".)

  • S'agit-il d'un exemple valide de ce type (par exemple, pour tout format de type XML, vous pouvez valider par rapport à une DTD.)

Je pense que, pour chaque format, vous devriez poser des questions distinctes pour chacun, car la réponse sera très différente pour les PDF par rapport aux fichiers ZIP.

J'ai utilisé mime_content_type compatible avec PHP 5.2, car je ne peux utiliser ni Fileinfo (il nécessite PHP 5.3) ni system () , qui est désactivé par mon fournisseur. . Par exemple, je vérifie si un fichier est un fichier texte ainsi:

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

Vous pouvez voir un exemple complet dans le répertoire "Listener & Annuaire de sous-répertoires PHP". Visionneuse de fichiers et téléchargeur " à: http://www.galgani.it/software_repository/index.php

if(isset(<*>FILES['uploaded'])) {
    $temp = explode(".", <*>FILES["uploaded"]["name"]);

    $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods");

    $extension = end($temp);
    if( in_array($extension, $allowedExts)) {
       //code....

    } else {
        echo "Error,not Documentum type...";
    }
}

Voici la fonction type_mime_fichier de iZend:

function file_mime_type($file, $encoding=true) {
    $mime=false;

    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $file);
        finfo_close($finfo);
    }
    else if (substr(PHP_OS, 0, 3) == 'WIN') {
        $mime = mime_content_type($file);
    }
    else {
        $file = escapeshellarg($file);
        $cmd = "file -iL $file";

        exec($cmd, $output, $r);

        if ($r == 0) {
            $mime = substr($output[0], strpos($output[0], ': ')+2);
        }
    }

    if (!$mime) {
        return false;
    }

    if ($encoding) {
        return $mime;
    }

    return substr($mime, 0, strpos($mime, '; '));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top