2012-08-01 10 views
7

Attualmente sto lavorando su un sito Web dove gli utenti possono caricare file. Come posso evitare di caricare file di grandi dimensioni? Al momento, nessuna opzione (PHP post_max_size e upload_max_filesize) è stata utile: il file è stato caricato interamente. Mi piacerebbe semplicemente che la connessione fosse chiusa con file troppo grandi (controllando in anticipo l'intestazione HTTP Content-Length e controllando il caricamento del file). C'è una direttiva Apache o una chiave di configurazione PHP per questo?Chiudi connessione Apache con upload di file troppo grandi

Grazie per il vostro tempo!

MODIFICA: aggiunta Apache conf (impostazione predefinita CentOS).
EDIT2: aggiunto PHP conf (predefinito CentOS).

EDIT3: Sembra che PHP chiuda il pipe quando viene fornito un file troppo grande. Tuttavia, Apache consente ancora il trasferimento fino alla fine.

+0

http://stackoverflow.com/questions/4738691/php-bulk-post-500-apache-internal-server-error/4739476#4739476, controllare i parametri di tale risposta – regilero

+0

Abbiamo provato tutti questi eccetto il tempo -relativi: non vogliamo essere dipendenti dalla velocità della connessione. Ad ogni modo, PHP sembra non essere il problema, è piuttosto Apache. – Iso

+0

Come indicato nel link e nella risposta @PhpMyCoder hai LimitRequestBody nelle impostazioni di Apache. – regilero

risposta

2

Ok.

Quindi il problema principale che si trovano ad affrontare è che la direttiva Apache LimitRequestBody o LimitXMLRequestBody vengono applicati dopo il completamento del caricamento. Sembra che Apache stia aspettando un file completo in una cartella temporanea prima di controllare la dimensione.

Quindi è necessario tagliare la connessione subito dopo il rilevamento di caricamenti troppo grandi. Mod_throttle era un modulo disponibile per farlo. Controllando questo Alternative to mod_throttle servfault question puoi avere un elenco di moduli di controllo a banda larga che possono adattarsi alle tue esigenze.

mod_bwshare ad esempio è in grado di limitare la larghezza di banda per IP client, ma non è un limite per_IP per richiesta. C'è anche mod_quos, che gestisce un sacco di limitazioni sui download, ma non riesco a trovare molte cose per la gestione del caricamento (solo la chiusura anticipata del caricamento lento potrebbe essere). Vedi anche this answer on throttling uploads.

così si può anche verificare la presenza di livello di sistema operativo limitazione (sullo stack TCP) o firewall avanzato capacità (chiedere a servfault).

È inoltre possibile utilizzare gli strumenti di limitazione lato client, come i valori dei moduli nascosti o le impostazioni di js uploader, ma come qualsiasi cosa utilizzato lato client, in termini di sicurezza non è possibile evitare che qualcuno modifichi le limitazioni lato client.

2

È possibile utilizzare apache LimitRequestBody. La sintassi è semplice (e in byte):

LimitRequestBody 10490000 # 10 MB 

Questo funziona sia in httpd.conf e .htaccess, basta essere consapevoli di riavviare se si modifica httpd.conf (sudo service apache2 restart su Ubuntu).

Se è necessario impostare le restrizioni su una base per file (limite avatar caricare a 5 MB, ma gli allegati limite a 20 MB), è possibile utilizzare <Files>:

<Files avatarUpload.php> 
    LimitRequestBody 5242880 # 5 MB 
</Files> 

<Files attachmentUpload.php> 
    LimitRequestBody 20971520 # 20 MB 
</Files> 
+2

Abbiamo testato anche questo; purtroppo il file è completamente caricato e Apache rilascia la connessione in seguito. – Iso

+0

Davvero? Quindi dovresti registrare un bug report con Apache - questo contraddice esplicitamente ciò che questa funzionalità è destinata a fare (cioè io sono molto dubbioso sulla tua metodologia) – symcbean

+0

Good One .... :) – Baba

Problemi correlati