Visualizzazione risultati 1 fino 3 di 3

Discussione: [php] header scaricano html

  1. #1
    Guest

    Predefinito [php] header scaricano html

    Salve,
    sono nuovo di qua anche se non sono nuovo del php.
    Mi sono trovato di fronte ad un problema che da solo non riesco a risolvere quindi speravo che qualche anima pia potesse scovare l'errore.

    Ho già cercato su internet, di tutto e di più ma qualsiasi tentativo è fallito.
    Allora, premetto che comunque me la cavicchio con Php, MySql e questo genere insomma. Ho creato un sito con registrazioni e delle gallery a cui si può accedere al download soltanto registrandosi. Il sito è quasi pronto ma mi sono ritrovato di fronte un ultimo terribile problema. Il download deve essere fatto attraverso gli headers (quindi attraverso php) che però non si degnano di funzionare. Vi spiego quali sono stati i miei tentativi in modo che magari capiate meglio e sappiate risolvere più velocemente.

    Mi sono dato una guardata a varie guide su questi headers utili allo scopo di scaricare un file che teoricamente il file .htaccess bloccherebbe via html o attraverso il cosiddetto hotlink. Quindi ho provato creando una pagina che tramite un get (con i dovuti controlli del caso e controllando se chi entra è registrato) mi fornisce il nome del file da scaricare. In seguito passa tutto (link e nome del file) agli header che teoricamente dovrebbero permettere di scaricare il file in questione. Dopo vari tentativi sono riuscito a fargli scaricare un rar (sempre rar sarà, solo questo tipo di file devo mettere in download) di 144byte che dopo molto tempo mi sono accorto essere un file con estensione .rar della pagina di download. In pratica:

    <html>
    bla bla..
    <p>il file sta per essere scaricato</p>
    bla bla
    </html>

    Mi scarica cioè un finto file rar che in realtà aprendolo con un editor di testo si tratta della semplice pagina di download (solo la sua parte html). Ovviamente i link per il rar sono corretti, ho fatto vari controlli al riguardo.
    Vi posto l'essenziale del codice che ho usato per il download:

    Codice PHP:
    <?php

    $dir
    = "directory da cui deve attingere e che sarebbe
    protetta teoricamente tramite .htaccess /download/"
    ;
    /**
    Per assicurarmi che il problema non fosse dovuto al link,
    ho provato sia con http://www.xp... eccetera.
    Sia con un link relativo del tipo ../download/... ma in
    entrambi i casi non ha funzionato restituendomi o un file:
    "http-__xpixe.... " (chiamato proprio così) oppure un file
    che sembrava buono ma in realtà era un file di testo.
    **/

    $file = $dir . $_GET['id'];

    if(!
    file)
    {
    die(
    "Il file non esiste!");
    }else{
    header("Cache-Control: ");
    header("Pragma: ");
    /**
    Ho letto che conviene metterli anche se vuoti questi 2 headers
    per evitare errori di IE.
    Naturalmente ho provato anche senza e anche mettendoci dentro del codice.
    **/
    header("Content-Description: File Transfer");
    header("Content-Type: application/force-download");
    //Ho tentato anche con:
    header("Content-type: Application/octet-stream");
    //ma non ha funzionato.
    header("Content-Type: application/rar"); //tentando con o senza questo header.
    header("Content-Transfer-Encoding: binary"); //provato anche senza questo.
    header("Content-Length: " . filesize($file));
    header("Content-Disposition: attachment; filename= " . $_GET['id'] . ".rar");
    /**
    Provando con l'intero indirizzo del file nel filename="" non riusciva nemmeno a
    riconoscere il tipo di file che doveva scaricare.
    ad un certo punto mi aveva anche iniziato a dare come file da caricare
    direttamente l'indirizzo ma con errori di sintassi.
    **/
    readfile($file);
    /**
    Con e senza questo readfile non dava comunque risultati accettabili.
    Mi sono dato una guardata sul manuale
    anche riguardo le funzioni ob_start() e ob_end_flush()
    ma non mi sono sembrate utili allo scopo.
    Comunque ho tentato anche con quelle insieme agli header ma non ha lo stesso
    portato a niente.
    **/
    }

    ?>
    La cartella download è chiusa tramite un file .htaccess con cui ho fatti vari tentativi. Gli ultimi tentativi sono questi due, entrambi trovati su internet (non mi ero mai dedicato a questo file htaccess quindi so solo l'indispensabile al riguardo):

    Codice:
    <Files ~ "\.rar$">
    deny from all
    </Files>

    Codice:
    <Files somefile>
    ForceType application/x-httpd-php
    AcceptPathInfo On 
    </Files>

    Non so cosa altro tentare per far funzionare il download. Ci tengo a precisare che provando con download diretto (hotlink) la pagina da errore 403, che appunto sarebbe l'errore in cui la directory non è accessibile dall'esterno.

    Spero sappiate aiutarmi che sono 2 giorni che faccio tentativi. Mi sono già trovato in difficoltà con altre cose e comincio a non farcela più.

    Preciso che i file che devo mettere in download sono solo di formato compresso rar, dato che molto spesso cercando sul web ho notato che parlavano di file zip e magari il fatto che siano rar influisce su qualcosa.
    Ovviamente il mio sito si trova qui su altervista.
    Per qualche assurda ragione le guide al riguardo trovate in giro per il web sono tutte piuttosto diverse, che è uno dei motivi per cui sto impazzendo per capire come faccia a non funzionare e per quali motivi.
    Ultima modifica di xpixel : 17-06-2011 alle ore 04.57.45

  2. #2
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Prova a seguire il codice di esempio che trovi nella documenzione uffuciale di php, relativo alla funzione readfile.

    Ti consiglio anche di stare attento a come imposti la variabile $dir, se vuoi partire dalla root considera di usare il percorso assoluto ( /membri/tuonick/ ) o i percorsi relativi ( ../, ./ ).

    E poi, non fidarti mai dei dati così come ti arrivano ( $_GET['id'] ); fai dei controlli specifici per evitare che qualche utente di cattive intenzioni possa approfittarne.
    Ultima modifica di javascripter : 17-06-2011 alle ore 14.35.49

  3. #3
    Guest

    Predefinito

    Per qualche miracolo divino ci sono riuscito grazie anche ai buoni consigli di Javascripter che ringrazio. Condivido per i posteri questo script come è ora funzionante. Sinceramente non ho capito comunque dove fosse il problema prima. Forse nella directory che dovevo mettere come mi aveva detto Javascripter (e che invece avevo scritto http:... eccetera).
    Comunque grazie per il consiglio riguardo alla sicurezza sul get (per via dell'XSS) ma avevo semplicemente glissato quella parte per non buttare nel topic 800 righe di php che non centravano niente con la domanda, comunque grazie per avermelo fatto notare nel caso che non lo avessi saputo da me. :P
    Vabbè, ecco a voi:
    Codice PHP:
    $filename = "/membri/xpixel/*CENSURO*/download/" . $_GET["id"] . ".rar";

    header("Content-Description: Download scheda");
    header("Content-type: Application/octet-stream");
    header("Content-Disposition: attachment; filename=". basename($filename));
    header("Content-Transfer-Encoding: binary");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header("Content-Length: " . filesize($filename));
    ob_clean();
    flush();
    readfile($filename);

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •