Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68

    [FILE_DOWNLOAD] Scaricare file fuori dalla wwwroot

    Premetto che:
    Uso IIS 5.1 (WinXp Prof. SP2)
    Lo script ha come percorso inetpub\wwwroot\download.php
    http://localhost/ è la directory wwwroot (valori predefiniti di IIS)
    nella wwwroot è installato mambo
    Dati diritti di lettura su tutti i file toccatti da questo script

    allora:
    diciamo che questa è la struttura della directory Inetpub:

    Quello che devo fare è:
    riuscire a far scaricare un file (situato fuori dalla wwwroot) con qualsiasi estensione tramite uno script php.
    i link saranno http://localhost/download.php?file=patch
    lo script asocia a delle stringhe conosciute (quindi patch in questo caso) un file.
    in un altra variabile metto il path che porta fuori dalla directory wwwroot. (../Sphereserver/DOWNLOAD_FILES)
    lo script deve interfacciarsi con mambo e leggere le informazioni di login (devi essere logato per poter scaricare il file)
    Il tutto funziona...
    adesso i problemi:
    con firefox se il file ha estensione .exe mi salva il file come nomefile.exe.htm (con il normale contenuto del file, rinominandolo in .exe è funzionante)
    con internet explorer invece di salvare il file mi stampa nella finestra il suo contenuto (tutti caratteri strani visto che non è un file di testo.)

    questo è il contenuto del file donwload.php che ho scritto fino adesso:

    codice:
    <?php
    
    //interfacciamento con mambo
    include_once( 'globals.php' );
    require_once( 'configuration.php' );
    
    if ( $mosConfig_offline == 1 ){
    	include( 'offline.php' );
    	exit();
    }
    
    require_once( 'includes/mambo.php' );
    require_once( 'includes/frontend.php' );
    
    $option = trim( strtolower( mosGetParam( $_REQUEST, 'option' ) ) );
    $database = new database( $mosConfig_host, $mosConfig_user, $mosConfig_password, $mosConfig_db, $mosConfig_dbprefix );
    $database->debug( $mosConfig_debug );
    $mainframe = new mosMainFrame( $database, $option, '.' );
    $mainframe->initSession();
    $my = $mainframe->getUser();
    
    $path="../Sphereserver/DOWNLOAD_FILES";//path dove prendere i file
    $filename="nofile"; //valore iniziale del $filename
    
    //sostituzione del $filename se conosce la stringa pasata come query
    if ($_GET['file']=="patch") {
    	$filename="patch.rar";
    }//eventuali else if per sostituzione stringhe con altri file
    
    //stampa errore e uscita nel caso di stringa non riconosciuta
    if ($filename=="nofile") {
    	echo "<html><head><title>Errore</title><META HTTP-EQUIV=\"refresh\" CONTENT=\"7; url=index.php\"><body>Impossibile scaricare questo file!</body></html>";
    	exit();
    }
    
    //stampa errore e uscita nel caso di login non eseguito
    if ($my->username=="") {
    	echo "<html><head><title>Errore</title><META HTTP-EQUIV=\"refresh\" CONTENT=\"7; url=index.php\"><body>Devi esere logato per poter scaricare questo file!</body></html>";
    	exit();
    }
    
    //stampa errore e uscita nel caso di $filename non esistente nella path definita
    if (!file_exists("$path/$filename")) {
    	echo "<html><head><title>Errore</title><META HTTP-EQUIV=\"refresh\" CONTENT=\"7; url=index.php\"><body>File $filename non presente sul server!
    Segnalare l'errore all'admin.</body></html>";
    	exit();
    }
    
    //invio file  :confused: 
    header("Content-Disposition: atachment; filename=$filename");
    header("Pragma: no-cache");
    header("Expires: 0");
    $fp=fopen("$path/$filename","r");
    print fread($fp,filesize("$path/$filename"));
    fclose($fp);
    exit();
    
    ?>
    credo la parte problematica sia l'ultima. ci son metodi alternativi per fare ciò?
    questo è quanto.

    spero mi potiate aiutare perché è veramente importante per me.

    vi ringrazio moltissimo per le vostre risposte.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68
    meno di 24 ore ed è finito in 3a pagina :master:

  3. #3
    non ho idea di come funzioni iis e soprattutto come funzioni su windows (usa linux e apache per php appena puoi), però a meno che non esegui lo script in locale direi che hai scarse possibilità (e comunque sarebbe un po' problematico)... Penso che per il webserver wwwroot sia la radice (root)... Però prendi questa mia affermazione con il beneficio del dubbio, nell'attesa di qualcuno più esperto... :master:
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68
    beh non decido io il sistema del host purtroppo.
    il host offre iis su windows. io mi devo addeguare.

    qualcuno che può aiutarmi?

  5. #5
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Non ti so rispondere esattamente ora, ma metterti sulla buona strada sì: è un problema di dare i giusti header ai browser per dir loro come trattare lo stream che gli sta arrivando e comunicar loro il formato.

    Ciò detto, quello che potrebbe esser pericoloso. Io ripenserei all'intera struttura di modo che il file downloadabili siano solo nelle wwwroot.


    [.:: JaguarXF ::.]
    __________________

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68
    non credo possa essere pericolo.

    se tu hai visto lo script tu li passi tramite query

    download.php?file=patch

    nello script sostituisce la parola che gli passi con il nome di del file se lo trova altrimenti con un valore conosciuto che dopo blocherà il download.

    esempio

    download.php?file=patch

    sostituisco con patch.rar


    download patch.rar

    download.php?file=tuttelepassword.rar

    sostituisco con nome file xke non conosco la stringa

    controllo il file il nome del file, e poi scarico.

    ma si blocca xke trova la stringa nome file.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68
    Ho risolto cercando vari head in giro. funziona sia su ie che su firefox.

    codice:
    header('HTTP/1.1 200 OK');
    header('Date: ' . date("D M j G:i:s T Y"));
    header('Last-Modified: ' . date("D M j G:i:s T Y"));
    header("Content-Type: application/force-download");
    header("Content-Lenght: " . (string)(filesize("$path/$filename")));
    header("Content-Transfer-Encoding: Binary");
    header("Content-Disposition: attachment; filename=$filename");
    @readfile("$path/$filename");
    exit();

  8. #8
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Il pericolo è dovuto al fatto che, abilitando i permessi all'interprete PHP (cioè all'utente con cui gira Apache/IIS) di "girovagare" fuori dalla document root, ti scotti nel caso in cui il tuo programma venga bucato da un attaccante.

    Se non è ingabbiato, il danno può propagarsi a macchia d'olio, specie su Win -- non per sua intrinseca natura, ma per il fatto che generalmente è mal configurato.

    [.:: JaguarXF ::.]
    __________________

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    68


    beh in tal caso sarebbe un problema :|


    sai dirmi se plesk è valido?
    xke il fornitore usa plesk...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.