PDA

Visualizza la versione completa : Download file e sicurezza


homeworker
12-02-2005, 17:45
Ho trovato nelle pillole in rilievo lo script di shishii per forzare lo scaricamento di file, ma le frasi
Si fa presente che il codice seguente è funzionante ma solo indicativo in quanto *NON* contiene alcun meccanismo di sicurezza.
RICORDATEVI di implementare le necessarie sicurezze per evitare che un lamerazzo vi scarichi il file delle password. che significano?

Ho provato lo script, funziona benissimo ed era proprio quello di cui avevo bisogno MA non vorrei aprire un baco gigantesco nel server...

Lo script è questo:

#!/usr/bin/perl

use strict; # Ormai oggi è quasi obbligatorio.
use CGI; # semplifica la lettura dell'input

my $dir = "/var/www/html"; # directory che contiene i file da scaricare

my $q = new CGI;

my $file = $q->param('file'); # raccoglie il nome file

my $size = (-s "$dir/$file"); # ne calcola la dimensione

my $buf;

# segue l'header http necessario per impedire l'apertura
# del file
print "Content-type: octet/stream\n";
print "Content-length: $size\n";
print "Content-disposition: attachment; filename=$dir/$file\n\n";

open (FILE, "<$dir/$file");
# il file viene letto e poi scritto sullo STOUT
# differenziando i file binari da quelli ASCII
if (-B "$dir/$file") {
binmode FILE;
while (read FILE, $buf, 1024) {
print $buf;
}
} else {
while (<FILE> ) {
print;
}
}
close FILE;

exit; Grazie

LordSaga640
12-02-2005, 18:09
intende dire che se io richiedo la pagina:
/../../../../etc/passwd (non mi ricordo dov'è sta il file delle password), il tuo amico ti può scaricare qualsiasi file presente sul server.

E' opportuno quindi fare controllo sull'indirizzo del file passato.
Controllare che i doppi punti non siano presenti e altre cose che ora non mi vengono in mente.


capito?
ciao

homeworker
12-02-2005, 19:20
Quindi passando un parametro "cattivo" potrei teoricamente leggere tutto sul computer. :oVVoVe:

Se filtro il my $file = $q->param('file'); che contenga solo certi caratteri potrei essere ragionevolmente sicuro...

Perl mi piace un casino per semplicità e quantità di funzioni ma credo che mi devo studiare un pò di sicurezza.

LordSaga640
13-02-2005, 11:50
Originariamente inviato da homeworker
Quindi passando un parametro "cattivo" potrei teoricamente leggere tutto sul computer. :oVVoVe:

Se filtro il my $file = $q->param('file'); che contenga solo certi caratteri potrei essere ragionevolmente sicuro...

Perl mi piace un casino per semplicità e quantità di funzioni ma credo che mi devo studiare un pò di sicurezza.
Anche a me piace molto il perl.
CMQ, all'inizio si provano a togliere i bachi più evidenti.
In questo caso controlli che certi caratteri non siano presenti.
penso che:
die "contiene doppi punti\n" if $file=~ /\.\./;

possa bastare nel tuo caso.

Ciao :)

shishii
13-02-2005, 12:27
Molto meglio fare il lavoro contrario, cioè consentire solo i caratteri ammessi, ad es:

die "Errore\n" if ($q->param('file') !~ /[a-zA-Z0-9_.-]+/ or $q->param('file') =~ /\.\./);

un punto lo devi ammettere per forza, ma devi escludere tutti gli altri caratteri che non hanno senso nel nome di un file: /\ ' " & $; eccetera.

homeworker
13-02-2005, 12:54
Grazie.

Volendo potrei anche fare:
die "Errore\n" if ($q->param('file') !~ /^inizio/);

E nomino i file (nel mio caso pdf) con "inizio" ad inizio nome...

shishii
13-02-2005, 13:22
Potrebbe andare, ma non ho fatto prove specifiche in modo da garantire la sicurezza del tuo metodo.

homeworker
13-02-2005, 14:47
Ok, grazie mille e buon lavoro a tutti

Loading