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.