PHP Convalida il caricamento file

Sono un principiante di PHP e attualmente sto imparando la parte "Convalida il caricamento del file".

Ho creato una pagina test.php contenente il seguente codice:

var_dump(@$_FILES['file']['type']); 

Innanzitutto, ho caricato un'image "img.gif" e l'ho restituita:

 string 'image/gif' (length=9) 

Quindi, ho cambiato l'estensione dell'image in ".jpg" e ha restituito:

 string 'image/jpeg' (length=10) 

Così ho capito $ _FILES ["file"] ["tipo"] restituisce solo l'estensione del file caricato, ma in realtà non controlla quale file è.

In questa pagina, http://www.w3schools.com/php/php_file_upload.asp , c'è un codice:

 $allowedExts = arrays("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_arrays($extension, $allowedExts)) 

Mi chiedo perché i codici sopra controllino l'estensione del file due volte? Ho cancellato alcuni dei codici precedenti e questo è il mio nuovo codice:

 $allowedExts = arrays("gif", "jpeg", "jpg", "png"); $extension = end(explode(".", $_FILES["file"]["name"])); if (($_FILES["file"]["size"] < 20000) && in_arrays($extension, $allowedExts)) 

Il mio codice è corretto? O hai qualche modo migliore per validationre il file di upload è un'image?

Grazie!

Dovresti passare il nome_mpmp del file * a getimagesize , ti darà la dimensione e il tipo dell'image (se si tratta di un'image). Se l'argomento passato è un file ma non un'image restituisce false, ciò consentirà di validationre.

Modifica: l'unico metodo affidabile per la validation dell'image è di crearne una copia utilizzando GD o Imagick: le immagini ottenute possono essere facilmente compromesse .

*: Voglio dire, il file temporale creato dopo il caricamento.

Per esempio:

 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $file = $_FILES['file']['tmp_name']; if (file_exists($file)) { $imagesizedata = getimagesize($file); if ($imagesizedata === FALSE) { //not image } else { //image //use $imagesizedata to get extra info } } else { //not file } } 

Questo codice usa file_exists solo per essere generale. Nel caso in cui nessun file è stato caricato $_FILES['file']['size'] = 0 , $_FILES['file']['tmp_name'] = '' e $_FILES['file']['error'] = 4 . Vedi anche is_readable . Per i valori di errore vedi errori di caricamento dei file spiegati su php.net .

 $allowedExts = arrays("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_arrays($extension, $allowedExts)) 

Questo viene controllato due volte perché, l'estensione del file e il "tipo di file" possono essere diversi, quindi qualcuno non può caricare file eseguibili con estensione .png.

Nel tuo codice modificato, è ansible caricare un diverso tipo di file con estensione modificata. come se potessero caricare un documento word con estensione ".png".

Il tuo nuovo codice controlla semplicemente l'estensione e non ha il doppio controllo.

Il tuo nuovo codice controlla solo l'estensione del file e la dimensione del file. Non controlla il tipo del file.

Raccomanderò caldamente di usare il vecchio codice perché lì controlla anche il tipo di file.