2009-08-08 11 views
5

Ho il seguente codice:Controllare tipo di file immagine e la taglia prima di caricamento di file in php

$filecheck = basename($_FILES['imagefile']['name']); 
    $ext = substr($filecheck, strrpos($filecheck, '.') + 1); 
    if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") && 
    ($_FILES["imagefile"]["size"] < 2120000)){ 
} else { 
echo "F2"; 
die(); 
} 

quello che devo fare è controllare se il file caricato è un jpg/GIF/PNG e che il suo meno di Dimensione di 2 mega.

Se è maggiore di 2 mega o non è il tipo di file corretto, è necessario restituire/echo F2 (codice di errore per api).

Quando uso il codice sopra per elaborare un file jpg 70k, restituisce F2.

SUBNOTE l'immagine di caricamento ha un'estensione di .JPG. Potrebbe caso essere un fattore? Se è così, come posso adattarlo?

+1

Per rispondere alla sottoreferenza: '$ ext = strtolower (substr ($ filecheck, strrpos ($ filecheck, '.') + 1));' – jimyi

risposta

22

Nota che potresti non voler fare affidamento sulle estensioni dei file per determinare il tipo di file. Sarebbe piuttosto facile per qualcuno per caricare un file eseguibile con estensione .png. Un mime-type può anche essere facilmente falsificato da un client malevolo per passare come immagine Fare affidamento su tali informazioni è un rischio per la sicurezza.

PHP Documentation:
Il tipo MIME del file, se il browser fornito tali informazioni. Un esempio potrebbe essere "image/gif". Questo tipo di mime non è tuttavia controllato sul lato PHP e pertanto non è possibile dare il valore per il numero concesso.

provare a caricare le immagini con gd (getimagesize()) per assicurarsi che essi sono in realtà immagini valide (e non solo file casuali pretesi con l'intestazione di un file immagine ... finfo_file si basa su queste intestazioni).

if($_FILES["imagefile"]["size"] >= 2120000) { 
    echo "F2"; 
    die(); 
} else { 
    $imageData = @getimagesize($_FILES["imagefile"]["tmp_name"]); 

    if($imageData === FALSE || !($imageData[2] == IMAGETYPE_GIF || $imageData[2] == IMAGETYPE_JPEG || $imageData[2] == IMAGETYPE_PNG)) { 
     echo "F2"; 
     die(); 
    } 
} 

Se davvero si deve utilizzare l'estensione per verificare se il file è un'immagine, utilizzare strtolower() per mettere l'estensione in minuscolo.

$filecheck = basename($_FILES['imagefile']['name']); 
$ext = strtolower(substr($filecheck, strrpos($filecheck, '.') + 1)); 

if (!(($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["imagefile"]["type"] == "image/jpeg" || $_FILES["imagefile"]["type"] == "image/gif" || $_FILES["imagefile"]["type"] == "image/png") && 
    ($_FILES["imagefile"]["size"] < 2120000))){ 
    echo "F2"; 
    die(); 
} 
+0

Extra, metafisico +1 per una risposta eccellente. –

5

SUBNOTE il caricamento dell'immagine ha un'estensione di .JPG. Potrebbe caso essere un fattore? Se è così, come posso adattarlo?

Sì, questo è il problema. Si dovrebbe essere aggiunge strtolower() per questa linea:

$ext = substr($filecheck, strrpos($filecheck, '.') + 1); 

come:

$ ext = strtolower (substr ($ filecheck, strrpos ($ filecheck,) + 1) '');

Questo risolverà il problema corrente. Ma tecnicamente, non dovresti preoccuparti delle estensioni dei file, dovresti solo controllare il tipo MIME

+0

tipo MIME. Il file potrebbe anche essere chiamato .jpeg. –

+0

Fare affidamento su tali informazioni ** è un rischio per la sicurezza **. Si prega di leggere la mia risposta qui sotto. –

5

I confronti come $ext == "jpg" controllano solo che lo $ext sia esattamente "jpg".

È possibile utilizzare strtolower su $ ext prima di eseguire tali confronti per gestire la situazione ".JPG".


Se si utilizza PHP < = 5.2, si potrebbe desiderare di utilizzare mime_content_type per verificare il tipo di contenuto dei file, invece di basarsi su $_FILES['imagefile']['name'] e/o $_FILES["imagefile"]["type"], che sono entrambi inviato dal client - e può, in quanto tale, essere falsificato.

Se si utilizza PHP> = 5.3, si potrebbe prendere in considerazione la nuova estensione fileinfo, ed è finfo_file funzione


Per la dimensione del file, si sta già utilizzando $_FILES["imagefile"]["size"]; va bene, suppongo, ma lo saprai solo quando il file è stato caricato - ancora, non c'è un modo reale di controllare quel genere di cose prima del caricamento, temo ...


tu potrebbe essere in grado di trovare qualche codice JS per eseguire un primo controllo preliminare dell'estensione prima che il file sia caricato, ma sarà comunque necessario controllare sul lato server, poiché qualsiasi cosa fatta dal lato client non è intrinsecamente sicura.

Non sono sicuro che si possa fare lo stesso per le dimensioni del file, anche se ...

Alcuni browser potrebbero supportare un campo nascosto denominato MAX_FILE_SIZE (consultare la documentazione su file upload); ma non sono sicuro che sia realmente supportato (mai visto in passato, in realtà, quindi probabilmente non è :-()


Come sidenote, probabilmente si vuole configurare upload_max_filesize, in modo che permette l'upload almeno altrettanto grande come quello che vuoi (per impostazione predefinita, è generalmente impostato su 2 MB, quindi dovrebbe già essere OK per te)

2

PHP è un linguaggio di scripting lato server e se le immagini sono al lato client, non è possibile controllare la loro dimensione tramite PHP prima caricamento.

+0

ottimo punto: alcuni javascript per controllare la dimensione del file possono essere utilizzati e rifiutati, mentre il * tipo di file * può essere controllato internamente allo script tramite la risposta di @Andrew Moore – warren

2

avete bisogno di due cose:

fare il vostro caso assegno estensione insensitive:

if($strtolower($ext == "jpg")){ 
    // do your stuff 
} 

Verificare se il file contiene in realtà un'immagine. Un modo semplice per farlo è fileinfo:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo, $filename); 
$finfo_close($finfo); 

Un modo alternativo di verificare se un file è davvero un'immagine si sta caricando in una libreria di immagini come gd. Se il tuo file può essere caricato con successo, è un'immagine.

Tenere presente che le immagini jpeg possono avere l'estensione .jpg o .jpeg.

3

prendere atto che per Internet Explorer, della presentazione tipo MIME del file JPEG come image/pjpeg - che è diverso da altri browser.

Ecco una semplice funzione per ottenere il vostro tipo MIME contro l'estensione del file:

function mime2ext($mime){ // mime is like image/jpeg 
    $m = explode('/',$mime); 
    $mime = $m[count($m)-1]; // get the second part of the mime type 
    switch($mime){ 
     case 'jpg': 
     case 'jpeg': 
     case 'pjpeg': 
      return 'jpg'; 
      break; 
     case 'png': 
      return 'png'; 
      break; 
     case 'gif': 
      return 'gif'; 
      break; 
    } 
    return ''; 
} 
3

dimensione del file è abbastanza ovvio, ma ciò che le persone stanno facendo qui sopra per verificare che è il formato giusto è un po 'inefficiente, e " non sicuro".

Ecco quello che faccio:

if($_FILES["userPicture"]["error"] == 0) { 
// File was uploaded ok, so it's ok to proceed with the filetype check. 
    $uploaded_type = exif_imagetype($_FILES["userPicture"]["tmp_name"]); 
    // What we have now is a number representing our file type. 

    switch($uploaded_type) { 
     case "1": 
      $uploaded_type = "gif"; 
     break; 
     case "2": 
      $uploaded_type = "jpg"; 
     break; 
     case "3": 
      $uploaded_type = "png"; 
     break; 
    } 
} 

Maggiori informazioni su;
http://www.php.net/manual/en/function.exif-imagetype.php

Edit: Questo ha il vantaggio di lavorare "in tutti i browser", perché non si basa sul nome del file, o l'utente niente forniti, ad eccezione del valore di file allineamento "errore", che ci dice che non c'era davvero un errore

Problemi correlati