Newsgroup: it.comp.www.php
Titolo: Limitazione dimensione file

Questo semplice script riceve il nome del file da scaricare e apre la dialog 
box che chiede dove salvare lo stesso.
<?php
$video_dir="/home/stefano/Video/";
$nome_file=$_POST['videoload'];
$dimensioni_file=filesize($video_dir.$nome_file);
header("Content-type: Application/octet-string");
header("Content-Disposition: attachment; filename=$nome_file");
header("Content-Description: Download PHP");
header("Content-Length: $dimensioni_file");
readfile($video_dir.$nome_file);
?>
Possibile che funzioni solo con file di dimensioni inferiori a 1GB ?  Se 
tento di scaricare file di dimensioni superiori ad 1GB il file viene 
tagliato.
C'e' qualche settaggio in qualche .ini file che devo fare ?
Ringrazio in anticipo per qualsiasi aiuto.
Stefano 

 viene tagliato.
Sei sicuro che non sia un problema di timeout?
Hai individuato una dimensione specifica oltre la quale il file viene
troncato ogni volta?
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 troncato ogni volta?
Provo a verificare meglio la dimensione. 1GB era indicativo.
Comunque la questione delle sicurezza mi preoccupa di piu', potresti 
spiegarmi meglio dove sta la falla ?
Grazie.
Stefano

 
$video_dir="/home/stefano/Video/";
$nome_file=$_POST['videoload'];
           ^^^^^^^^^^^^^^^^^^^^
Mettendo in post il nome del file da scaricare.
	Francesco

 Mettendo in post il nome del file da scaricare.
Porta pazienza ma continuo a non capire.
Appunto perche' sta in post non dovrebbero esserci problemi. Quel campo gli 
arriva da un form compilato da un'altra parte, come potrei bypassare il form 
e passargli un altro valore ?
Inoltre l'istruzione readfile($video_dir.$nome_file); preleva i file dalla 
cartella $video_dir.$nome_file che non contiene script php
Come sfrutteresti questa ipotetica voragine per downloadare file php ?
Ciao.
Stefano

 dalla cartella $video_dir.$nome_file che non contiene script php
$_POST["videoload"] = "/../../../etc/passwd"
giusto per dirne una.
Bye.

 tagliato.
Si trovano alcune info in giro riguardo il fatto che readfile e fpassthru 
leggano l'intero file in RAM prima di spedirlo all'utente.
Prova a usare fopen, fread e fwrite leggendolo a blocchi di, per esempio, 
64 KB.
Bye.

 giusto per dirne una.
Ok, e' vero !!!!
Come dovrei modificare il codice per renderlo piu' sicuro ?
Grazie per i consigli.
S.


Validando il valore che ti viene inviato dal form.
Per esempio potresti confrontare il valore che passa da post con una 
lista di file scaricabili, fare un basefile del valore (per evitare 
spostamenti in altre directory), una maschera sui file (p.e. *.gif) etc, 
dipende dalla circostanza.
	Francesco

Intanto vi ringrazio di nuovo per i preziosi consigli.
Pensavo di ovviare al problema di questo script e di tutti gli altri 
presenti nel mio piccolo web server in questo modo:
1) Creo una pagina di login in cui inserire userid e password,  che vengono 
confrontati con quanto presente in un database degli utenti.
2) Se i dati di login sono corretti setto una variabile SESSION, tipo:
$_SESSION['userid']=$user;
3) Modifico lo script di prima ed in genere tutti i file PHP inserendo in 
testa una verifica dell'esistenza di $_SESSION['userid'], in questo modo:
<?php
if(!isset($_SESSION['userid']))
{
 header('location:login.php');
 exit;
}
$video_dir="/home/stefano/Video/";
$nome_file=$_POST['videoload'];
$dimensioni_file=filesize($video_dir.$nome_file);
header("Content-type: Application/octet-string");
header("Content-Disposition: attachment; filename=$nome_file");
header("Content-Description: Download PHP");
header("Content-Length: $dimensioni_file");
readfile($video_dir.$nome_file);
?>
Cosa ne dite ?
Secondo voi e' sufficientemente sicuro cosi' ?
Stefano 

 
No poichè non hai risolto il problema.
Ovvero io sono un utente registrato sul tuo sito, modifico il dato 
inviato via post e scarico lo script, il file delle password, etc...
I file da scaricare sono personalizzati per ogni utente, oppure comuni? 
Nel primo caso, devi garantire che l'utente A non può scaricare i file 
di B, nel secondo hai il vincolo che per scaricare un file, l'utente 
deve essere registrato (e questo lo ottieni con il tuo codice).
Per il caso B puoi risolvere utilizzando basename nel tuo script:
$video_dir="/home/stefano/Video/";
$nome_file= basename($_POST['videoload']);
Per il caso A devi appoggiarti a uno script "ponte" per la gestione del 
download (vedi il posto di stamani "Impedire download file")
Ultima cosa: se la directory /home/stefano/Video/ è dentro la root 
directory del server web, puoi scaricare i file direttamente 
(
www.sito.it/Video/ciccio.abc
), saltando eventuali script php!
	Francesco


Stefano 

 La root sta in /home/stefano/public_html
Ottimo!
	Francesco

> La root sta in /home/stefano/public_html
virtualmin?  
anch'io ti esorto ad applicare una maschera sul nome file ,magari con una
regexp sui formati scaricabili che pero' renda il tutto caseinsensitive.
ciao


Mi sa che il problema era proprio questo.
Ho applicato il primo esempio degli utenti trovato qui: 
http://it.php.net/fread
 che in effetti utilizza fopen e fread ed ora va 
tutto a meraviglia.
Grazie.
S

Stefano ha scritto:

IMHO non usarei una cosa del genere per file di quelle dimensioni
in quanto i downloader non funzionano e sopra ai 200 mb
si usa normalmente un downloder
il php ancora non ha il supporto ai downloader

 il php ancora non ha il supporto ai downloader
Il supporto per downloader e' piuttosto facile da implementare (basta
conoscere il protocollo HTTP). Su php classes si trovano varie classi
che permettono di gestire la cosa.
