Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Scaricare file da pagina html

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Scaricare file da pagina html

Messaggioda Foto Utenteposta10100 » 13 dic 2010, 21:06

Ciao a tutti,
ho fatto un po di ricerche in rete ma il risultato è che tutto ciò che ho provato non funziona :-x
Sto mettendo in piedi un sito web dal quale vorrei dar la possibilità all'utente di scaricare dei file con estensione ".lib".

In rete suggerivano l'uso di php, supportato da altervista.org.
Questo è quello che ho implentato nel file downloadit.php:
Codice: Seleziona tutto
<?php
$file = $_GET['filename'];

// verifico che il file esista
if(!file)
{
  // se non esiste chiudo e stampo un errore
  die("Il file non esiste!");
}else{
  // Se il file esiste...
  // Imposto gli header della pagina per forzare il download del file
  header("Cache-Control: public");
  header("Content-Description: File Transfer");
  header("Content-Disposition: attachment; filename= " . $file);
  header("Content-Transfer-Encoding: text");
  // Leggo il contenuto del file
  readfile($file);
}
?>


e nella pagina HTML ho:
Codice: Seleziona tutto
<div class="libdownload"><a style="color: yellow;"
href="../../downloadit.php?filename=librerie/a78489930da64e82934a6b290b75a637npn.lib">Download</a></div>


Però non funziona!
Dove sbaglio?

Grazie a tutti!

Luca.
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[2] Re: Scaricare file da pagina html

Messaggioda Foto Utenteangus » 14 dic 2010, 2:04

Ciao,
a parte
Codice: Seleziona tutto
$file = $_GET['filename'];
...
readfile($file);

che fa paura solo a vederlo :twisted:

e quel controllo sull'esistenza del file, che dovrebbe essere qualcosa come
Codice: Seleziona tutto
if(!file_exists($file))

quello script funziona.

Se nel tuo caso specifico non funziona, probabilmente è perché non trova il percorso del file (e non te ne accorgi perché il controllo in realtà non controlla).
puoi specificare meglio dove hai la directory "librerie" rispetto al file downloadit.php ?
Inoltre, CREDO, il tuo intento sia avere la directory "librerie/" fuori dalla DocumentRoot del sito, per esempio per permettere il download solo a certe condizioni e non mediante link diretto.. altrimenti a che ti serve il tutto?

ciao
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25

0
voti

[3] Re: Scaricare file da pagina html

Messaggioda Foto UtenteBerello » 14 dic 2010, 2:27

Ma poi che tipo di errore ti dà? Ti dice sempre che non trova il file?

In un vecchio script che ho usato in passato, mettevo più controlli sul file e sul percorso.
Tra le varie cose, verificavo che il percorso segnalato dall'utente non contenesse rimandi alla cartella superiore:
Codice: Seleziona tutto
$file = str_replace("/../", "/", $_GET["nf"]);

e che iniziasse SEMPRE con il nome della cartella desiderata:
Codice: Seleziona tutto
if (substr($file, 0, 8) == "uploads/") {...}

in questo modo non c'è il rischio per errore o a causa di malintenzionati vengano letti files "sbagliati".

Dopodiché, assieme all'esistenza del file, controllavo la sua leggibilità (se non fosse leggibile, ci sarebbe un errore in lettura che non verrebbe gestito correttamente dal codice: ovvero apparirebbe all'utente un messaggio di errore del server che potrebbe rovinare l'impaginazione):
Codice: Seleziona tutto
if(file_exists($file) && is_readable($file)) {...}


Sono controlli che credo dovresti aggiungere al tuo codice.

Infine vedo che hai messo nell'header:
Codice: Seleziona tutto
Content-Transfer-Encoding: text

ma per i files credo tu debba usare:
Codice: Seleziona tutto
Content-Transfer-Encoding: binary

Io ad esempio usavo (nello stesso spezzone di codice):
Codice: Seleziona tutto
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Length:'.filesize($file));
header('Content-Transfer-Encoding: binary');


e infine usavo:
Codice: Seleziona tutto
if(@$file = fopen($file, "rb")) {
   while(!feof($file))
      echo fread($file, 8192);
   fclose($file);
}
exit(0);

Anche se la funzione readfile che usi tu sembra fatta appositamente per questo, quindi forse fai bene a mantenerla.

Vedi se con queste modifiche risolvi i problemi.
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[4] Re: Scaricare file da pagina html

Messaggioda Foto Utenteposta10100 » 14 dic 2010, 9:41

Innanzitutto grazie delle risposte!
angus ha scritto:che fa paura solo a vederlo :twisted:

Non conosco il php, mi sono limitato ad un copia incolla... forse un giorno scrivero` anche io degli script da paura :lol:
angus ha scritto:puoi specificare meglio dove hai la directory "librerie" rispetto al file downloadit.php ?

Nella root del sito ho il file downloadit.php e la directory "librerie" cha ha la subdir "a...".
Nella directory "a..." c'e` il file html dal quale voglio far scaricare il file .lib.
Mi sono accorto che manca una "/" nel path che ho postato ma questo l'ho gia` sistemato nel file html.
Berello ha scritto:Ma poi che tipo di errore ti dà? Ti dice sempre che non trova il file?

Non ci sono errori, almeno nella console di firefox. Solo che tenta di scaricare il file php al posto della libreria!
Berello ha scritto:o a causa di malintenzionati vengano letti files "sbagliati".

I malintenzionati non possono far danni, tutto quello che c'e` sul sito sara` distribuito gratuitamente a tutti coloro che lo visitano, non c'e` motivo di piratare le pagine! :lol:
Berello ha scritto:Infine vedo che hai messo nell'header: ....

Il file ha estensione ".lib" ma in realta` e` un file xml, quindi testuale.
Stasera provo a mettere il carattere "$" nell'if come suggerito da angus, effettivamente mi era sfuggito, e vi dico se funziona!

Grazie!

O_/
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[5] Re: Scaricare file da pagina html

Messaggioda Foto Utenteangus » 14 dic 2010, 11:07

Se il tuo problema è semplicemente forzare lo scaricamento dei file .lib invece di visualizzarli nel browser, e non hai altre esigenze quali tenere delle statistiche, proteggere i file, ecc...
allora ti basta un file .htaccess nella directory che contiene i file con dentro questo
Codice: Seleziona tutto
AddType application/octet-stream .lib

e poi usi link diretti tipo
Codice: Seleziona tutto
<a href="/librerie/a/libreria.lib">libreria.lib</a>

o quello che è

Se invece vuoi procedere col sistema dello script php, ti basta sistemare l'if come da mio post (non solo aggiungere $) e assicurarti di lavorare col path giusto.
Valuta anche i consigli di Berello, anche se qualche controllo aggiuntivo non farebbe male.
hint: lavorare con un hash del path/nomefile può semplificarti le cose.

forse un giorno scrivero` anche io degli script da paura

Non vorrei la prendessi come una critica, ma dare in pasto ad uno script un valore passato tramite GET così di brutto non si può proprio vedere... non è questione di scrivere codice elegante o meno

ciao!
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25

0
voti

[6] Re: Scaricare file da pagina html

Messaggioda Foto UtenteBerello » 14 dic 2010, 12:34

posta10100 ha scritto:[...]
I malintenzionati non possono far danni, tutto quello che c'e` sul sito sara` distribuito gratuitamente a tutti coloro che lo visitano, non c'e` motivo di piratare le pagine! :lol:
[...]

Diversi anni fa (mi pare intorno al 2001 o al 2002) i server IIS (Microsoft) avevano un bug che permetteva di accedere in lettura a qualunque file sul server.
In pratica chi aveva realizzato il server, aveva imposto il controllo sul percorso richiesto, eliminando tutti i percorsi contenenti rimandi alla cartella superiore "..". Il problema però era che l'indirizzo richiesto dal client veniva riprocessato più volte prima di essere utilizzato. Se invece del punto si usava la stringa %2E per richiedere un file, non c'era alcun problema. Però qualcuno si accorse che se il simbolo di percentuale "%" fosse stato scritto usando lo stesso encoding (% diventa %25), si poteva scrivere %252E o qualcosa del genere... Per cui al primo processamento la stringa diventava %2E, poi venivano fatti i controlli e non era rilevato alcun ".."! Dopodiché la stringa veniva nuovamente processata ed ecco che apparivano i ".."!!!
In quel modo era possibile richiedere di leggere il file
Codice: Seleziona tutto
cmd.exe comando che mi pare a me

(IIS lavora su server Microsoft e cmd.exe è il terminale... Facendo seguire a cmd.exe un qualsiasi comando o programma, questo viene eseguito sulla macchina)

Questo significa che, con questa disattenzione, non era soltanto a rischio il contenuto del server, ma anche il server poteva essere utilizzato a piacimento di chiunque, come se fosse il proprio computer.

Se quindi c'è un simile bug (come nel tuo codice, che permette di risalire le cartelle), io potrei usare il tuo server per fare qualcosa di illegale (ad esempio attacchi di altro genere ad altri server); dopodiché dare il comando che cancella tutti i LOG dal tuo server e allora la farei franca. E risulterebbe essere stato l'indirizzo IP del tuo server ad aver effettuato gli attacchi! :mrgreen:

Vabbè, a parte queste chiacchiere, era tanto per dire che secondo me non bisogna trascurare questi aspetti, non solo per il corretto funzionamento del proprio sito... :D
Poi, spesso, se il server è gestito da qualcun altro (amministratore esperto), queste operazioni vengono impedite attraverso altre misure di sicurezza. :mrgreen:

Scusa per le chiacchiere, ma spero che possano interessarti ugualmente! :mrgreen:

P.S.:
Una nota: il bug di cui ho parlato era diffusissimo e tantissimi server non avevano fatto l'aggiornamento che lo correggeva. Ricordo che, per sperimentare, avevo provato la cosa su diversi siti e avevo visto che effettivamente era fattibile: ricordo bene che il sito di Enrico Papi (non ricordo come ci fossi finito :mrgreen: ) era affetto dal problema e lo rimase per più di un mese dopo che io ero venuto a conoscenza del bug (pubblicato su una rivista di programmazione). Ovviamente non ho fatto niente, oltre al verificare l'effettiva esistenza dl bug! :mrgreen:
D'altra parte, vista la mia poca esperienza, mi avrebbero beccato subito... Senza metterci poi i sensi di colpa che avrei avuto se avessi fatto qualcosa! :mrgreen:
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[7] Re: Scaricare file da pagina html

Messaggioda Foto Utenteposta10100 » 14 dic 2010, 14:53

angus ha scritto:Non vorrei la prendessi come una critica, ma dare in pasto ad uno script un valore passato tramite GET così di brutto non si può proprio vedere... non è questione di scrivere codice elegante o meno

Non me la sono presa!
Fino a ieri di php conoscevo solo il nome, quindi quel comando mi sembrava ne piu` ne meno che uguale agli altri.
Forse un giorno decidero` di studiare php e capiro` perche` fa cosi` paura quel comando :lol:

Berello ha scritto:Scusa per le chiacchiere, ma spero che possano interessarti ugualmente! :mrgreen:

Questi aneddoti sono sempre interessanti!
Comunque non mettero` per ora altri controlli, probabilmente utilizzero` la soluzione di angus facendo a meno del php.
Agli attacchi informatici lascio che sia l'amministratore del server a porre rimedio.
Grazie ancora!

O_/
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.550 4 10 13
Master EY
Master EY
 
Messaggi: 4832
Iscritto il: 5 nov 2006, 0:09

0
voti

[8] Re: Scaricare file da pagina html

Messaggioda Foto Utenteangus » 14 dic 2010, 15:45

posta10100 ha scritto:probabilmente utilizzero` la soluzione di angus facendo a meno del php.

Che, mi sono dimenticato di dirlo, funziona solo su apache e solo se l'amministratore lo permette.
Su altervista dovresti essere apposto, ma non metto la mano sul fuoco perché l'ho usato l'ultima volta parecchi anni fa.
posta10100 ha scritto:Agli attacchi informatici lascio che sia l'amministratore del server a porre rimedio.

Giusto! ... ma all' 80%
Soprattutto in PHP, ma in qualsiasi altro linguaggio che poi va a finire sul web, una programmazione che tenga conto dei comportamenti imprevisti, maliziosi e potenzialmente ostili degli utenti è quasi obbligatoria.
Per molti anni si è parlato male del PHP (che ha sofferto di problemi congeniti e si presta molto ad essere utilizzato male) anche perché circola(va) molto codice pieno di bug e vulnerabilità.
È vero che alla sicurezza ci deve pensare l'amministratore del server, ma anche chi scrive gli script deve fare la sua parte.
Ricordo che, in piccolo da qualche parte, nel 99% dei contratti di hosting c'è una frasetta che suona come: "se il tuo script crea problemi ci riserviamo di toglierlo o revocarti l'account". Alcuni hanno addirittura una lista di script che non puoi installare sui loro server condivisi perché affetti da problemi noti.
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.490 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4172
Iscritto il: 20 giu 2008, 17:25


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti