Domanda

Sul sito Web di PHP, l'unico vero controllo che suggeriscono è l'uso di is_uploaded_file () o move_uploaded_file () , qui . Ovviamente di solito non vuoi che l'utente carichi alcun tipo di file, per una serie di motivi.

Per questo motivo, ho spesso usato alcuni "rigidi" controllo del tipo mime. Naturalmente questo è molto imperfetto perché spesso i tipi MIME sono sbagliati e gli utenti non possono caricare i loro file. È anche molto facile falsificare e / o cambiare. E insieme a tutto ciò, ogni browser e sistema operativo li gestisce in modo diverso.

Un altro metodo è quello di verificare l'estensione, che ovviamente è ancora più facile da modificare rispetto al tipo mime.

Se vuoi solo immagini, usare qualcosa come getimagesize () funzionerà.

Che dire di altri tipi di file? PDF, documenti Word o file Excel? O anche solo file di testo?

Modifica: se non hai mime_content_type o Fileinfo e il sistema (" file - bi $ uploadfile ") ti dà il tipo di file sbagliato, quali altre opzioni ci sono?

È stato utile?

Soluzione

Dai un'occhiata a mime_content_type o Fileinfo . Questi sono comandi PHP integrati per determinare il tipo di un file osservando il contenuto del file. Controlla anche i commenti sulle due pagine precedenti, ci sono altri buoni suggerimenti.

Personalmente ho avuto fortuna ad usare qualcosa che è essenzialmente il sistema (" file -bi $ uploadfile ") , ma non sono sicuro che sia il metodo migliore.

Altri suggerimenti

IMHO, tutti i metodi di controllo del tipo MIME sono inutili.

Supponi che dovresti avere application / pdf di tipo MIME. I metodi standard stanno cercando di trovare qualcosa che assomigli a un'intestazione PDF (% PDF- o smth. Così) e restituiranno "Okay, sembra che questo sia un file PDF" in caso di successo. Ma in realtà questo non significa nulla. Puoi caricare un file contenente solo % PDF-1.4 e passerà il controllo MIME.

Voglio dire se il file ha un tipo MIME previsto: passerà sempre il controllo del tipo MIME, altrimenti il ??risultato non sarà definito.

Suppongo che avrai una lista bianca fissa di tipi di file che accetti.

Per ciascuno di questi tipi, dovrai utilizzare tecniche diverse per verificare che siano esempi validi di quel formato.

Esistono due domande correlate:

  • Sembra più o meno come potrebbe essere il tipo giusto? (Per JPEG, puoi controllare le intestazioni, come hai già detto. Per molti formati basati su Unix, puoi controllare il "biscotto magico").

  • È in realtà un esempio valido di quel tipo (ad es. per qualsiasi formato simile a XML, è possibile convalidare un DTD.)

Penso che, per ogni formato, dovresti porre domande separate per ognuno, perché la risposta sarà abbastanza diversa per i PDF rispetto ai file ZIP.

Ho usato mime_content_type compatibile con PHP 5.2, perché non posso usare né Fileinfo (richiede PHP 5.3) né system () , disabilitato dal mio provider . Ad esempio, controllo se un file è un file di testo, quindi:

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

Puoi vedere un esempio completo nel mio " Directory PHP e nel Listener di sottodirectory & amp; File Viewer and Downloader " a: 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...";
    }
}

Ecco la funzione file_mime_type di 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, '; '));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top