2013-03-24 6 views
5

Io uso var_dump(@$_FILES['file']['type']) per testare il tipo di file che ho caricato

In primo luogo, ho caricato un exe file chiamato "uninstall.exe", ed è tornato

"string 'application/octet-stream' (length=24)" 

Poi, ho rinominato questo file per uninstall.png, è tornato

string 'image/png' (length=9) 

la mia conclusione è: $ _FILES [ 'file'] [ 'type'] solo che estensione di file ck, non il tipo di file originale.

Il seguente codice da w3cschool:

$allowedExts = array("gif", "jpeg", "jpg", "png"); 
$extension = end(explode(".", $_FILES["file"]["name"])); 
if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/jpg") 
|| ($_FILES["file"]["type"] == "image/png")) 
&& ($_FILES["file"]["size"] < 20000) 
&& in_array($extension, $allowedExts)) 

penso $_FILES["file"]["type"] nei codici di cui sopra non è necessaria, possiamo solo controllare estensione del file utilizzando explode() e in_array

Sono solo un principiante php, qualcuno può confermare la mia idea? Grazie!

+1

Sì, credo che molti di noi sanno che il tipo di file può essere falsificato. – Class

+4

Una lezione per non usare w3schools – SomeShinyObject

+1

Grazie, sono felice di aver trovato qualcosa di sbagliato in w3cschool – nut

risposta

5

Hai assolutamente ragione. Il tipo MIME è fornito dal client e non è possibile garantire che sia cor. ­ rect. Del resto, così è l'estensione del file. Se è necessario essere completamente sicuri, è necessario guardare il contenuto del file.

+0

Sono contento che la mia idea sia stata confermata, qualcuno ha detto: "l'estensione del file e 'tipo di file' può essere diversa, quindi qualcuno non può caricare file eseguibile con estensione .png con $ _FILES [" file "] [" tipo "]." Penso che abbia torto – nut

+0

@ user1970939: Beh, qualcuno potrebbe effettivamente fornire un file chiamato 'file.exe' con un tipo MIME di' image/png'. Sono entrambi forniti dal cliente e non devono essere coerenti. – icktoofay

7

Se si desidera essere sicuri che un'immagine sia stata caricata, utilizzare getimagesize, che restituisce 0 per non immagini.

+0

e anche alcuni JPEG. Per lo più JPEG che provengono da fotocamere digitali. –

+0

grazie per aver menzionato getimagesize – nut

+0

@darthmaim assolutamente errato! 'getimagesize' può e ritornerà con successo per alcune non immagini. Vedi [qui] (http://php.net/manual/en/function.getimagesize.php) – JDrake

1

Si dovrebbe utilizzare un wrapper di estensioni GD o Imagick. Uno molto buono è WideImage.

Problemi correlati