2015-05-03 10 views
15

Scusate se è banale o ovvio, ma non ho trovato la risposta cercandola su google.

Da dove viene il valore size nella matrice $_FILES['name']? Potresti fidarti del suo valore ($_FILES['name']['size']) o dovresti comunque controllarlo usando la funzione filesize()?

In altre parole, è necessario verificare le dimensioni effettive del file tramite la funzione filesize per notare se è stato caricato correttamente?

+0

possibile duplicato di [Can $ \ _ FILES \ [... \] \ ['size' \] essere falsificato?] (Http://stackoverflow.com/questions/24564656/can-files-size-be- forgiato) –

risposta

11

Se il file è stato caricato correttamente e tutto è a posto, è possibile utilizzare le informazioni fornite da PHP superglobal $_FILES. L'utilizzo di filesize() aggiunge un piccolo sovraccarico poiché il sistema operativo deve ispezionare il file per la dimensione. Dipende da te, ma controllare il codice sorgente PHP su come funziona tutto questo indica chiaramente che calcola correttamente la dimensione del file nella richiesta multipart HTTP. Fondamentalmente, faresti lo stesso lavoro di nuovo se si fosse a filesize() il file.

Il motivo per cui ci si può fidare direttamente di questa variabile superglobale è il fatto che le richieste multipart forniscono un limite tra cui risiedono i dati. Per definizione, non è possibile ottenere dati corrotti se non si segue il protocollo per l'estrazione dei dati. In altre parole, significa che il browser invia un "delimitatore" e PHP lo trova semplicemente e inizia a controllare il testo per i dati tra quel delimitatore. Per fare ciò, assegna con precisione la memoria richiesta e può immediatamente memorizzare nella cache il numero assegnato - e quel numero è la dimensione del file. Se qualcosa è sbagliato lungo il percorso, otterrai degli errori. Pertanto, se il file è stato caricato correttamente, le informazioni sulla dimensione sono attendibili.

9

PHP sembra ricalcolare la dimensione del file dopo che è stato caricato. Sebbene il client invii un'intestazione che specifica lo content-length del file, in base ai test (con PHP 5.5) questa intestazione viene semplicemente ignorata e, invece, viene misurata la lunghezza. Personalmente, utilizzerei sempre lo filesize() per ottenere le dimensioni del file, dal momento che puoi essere più sicuro riguardo a quale misurazione viene utilizzata, ma in definitiva dipende da te. In entrambi i casi, $_FILES['file_name']['size'] sembra essere un valore sicuro da utilizzare.

+2

Sei sicuro? Dalla mia comprensione della lettura del [codice sorgente responsabile per l'analisi delle richieste HTTP multipart] (https://github.com/php/php-src/blob/master/main/rfc1867.c), la * dimensione * risultante riflette il numero di byte letti dal corpo della parte multipart. – Gumbo

+0

@Gumbo Interessante, da quello che ho letto, è specificato dal client mentre 'upload_max_filesize' usa il conteggio misurato mentre viene caricato. Proverò a fare alcuni test e tornare da te. – Anonymous

+1

@ Gumbo Sì, hai assolutamente ragione. PHP sembra ricalcolarlo dopo che è stato caricato. – Anonymous

4

È preferibile controllare se il client riportato $_FILES['file_name']['size'] è uguale al valore indicato da filesize(). Una differenza potrebbe indicare un errore durante la trasmissione del file caricato.

Problemi correlati