• User Attivo

    Proteggere dei file

    Salve, c'è un modo su server shared hosting linux con Apache + PHP per proteggere il download di un file?

    Esempio ho una cartella "files" con tutti i download che voglio permettere al sito. Se un utente non è registrato non potrà mai accedere al download dal link nel sito, se uno è registrato può scaricarlo passando per una pagina che lo re invia al percorso del file (che verrà mostrato solo al download) dopo tot secondi e fino a qui ok. (come funziona ai grandi siti di download)

    Però in questo modo qualsiasi persona a conoscenza del percorso puntando direttamente al percorso del file (già navigando nel sito però evitare l'hotlinking se attivo) può scaricarlo evitando gli script php. C'è un modo per proteggere questi file e farli scaricare solo se un'utente è registrato e passa per una pagina apposta? mi verrebbe da pensare a qualche istruzione htaccess ma non vedo come possa sapere se tu sei autenticato o no visto che è indipendente da php


  • User Attivo

    Puo darsi che sia possibile, ma ti consiglio un altro metodo
    Visto che utilizzi un database per ogni utente registrato, crei una tabella chiamata downloads, con i seguenti campi

    name_file
    perc_file
    id_file

    dove ogni volta che un utente aggiungerà un file, e php si connetterà al db, salvi il nome del file con un codice random, poi aggiungi l'estensione(per il codice random ti consiglio $random = md5(uniqid(rand(), true)); cosi ottieni codice_random.estensione) nel primo campo, salvi il percorso nel secondo campo e nel terzo campo
    salvi un codice random(ti consiglio di usare
    $id_file = md5(uniqid(rand(), true)); che crea un codice random tra lettere e numeri di 32 caratteri).
    Una volta inserito questo codice dentro il terzo campo, rinomini il file inviato con questo codice.
    Quando clicchi il link (es www.sito .it/ download.php?id_file=877weuhy83rf8f83yf3f3ybf38fb(questa stringa è un esempio))
    Con get recuperi la variabile,poi con mysql_fetch_array controlli se questo codice recuperato con get è contenuto all'interno di name_file: se restituisce true, allora effettua il download
    Non è una soluzione elegante, ma puo funzionare


  • User Attivo

    Capito cosa intendi in effetti sarebbe un modo , ma in questo modo il percorso di download che viene visualizzato qual'è? E perché parli di aggiungere file?

    Sono download permanenti.


  • User Attivo

    Stavo pensando...se io proteggo la cartella dei download via htaccess negando l'accesso a tutti (quindi suppongo solo via web server) e poi i file li invio via header attraverso la famosa pagine download.php che controllerà se è autorizzato non dovrebbe partire il download utilizzando il percorso completo del server?


  • User Attivo

    e se fai un controllo della sessione utente all'inizio della pagina di download?

    if ($_SESSION['logged_in'] == 0){
    echo 'non puoi scaricare nada';}
    else.........


  • User Attivo

    Nel mio post sono stato frettoloso a scrivere.
    Quello che intende daWsOn_s è che, anche se un utente non è registrato, possa scoprire la cartella dove sono collocati tutti i file che potranno scaricare SOLO gli utenti registrati.
    Se usi le sessioni, lo stesso un utente non registrato puo scoprire la cartella contenente tutti i files
    Per questo la mia idea era rinominare tutti i files con un codice random di 32 caratteri + estensione


  • Bannato User Attivo

  • User Attivo

    La soluzione di saro78 opotrebbe essere la migliore


  • User Attivo

    Sto seguendo quel metodo, il tutto funziona tranne per alcune cose.

    Io volevo mettere tutto in una pagina (download.php?id_file=1) dove c'è il controllo del file (esistenza) e dell'accesso come utente registrato se è tutto ok si parte con l'invio al browser dopo tot secondi, mostrando un messaggio tipo "il download partirà tra poco". Siccome non sono riuscito a fare nulla in questo modo senza creare altre pagine ho dovuto creare un altro file (download_2.php) a cui la pagina del download.php manda in refresh dopo tot secondi e fa partire il download via readfile di php.

    I problema è che:

    • in questo modo se una persona va direttamente a download_2.php con la stringa via get esatta scarica il file senza passare per le mie pagine (quindi una sorta di download diretto)
    • facendo in questo modo che funziona , SOLO SU IE quando la pagina viene inviata a download_2.php da download_php il download non parte, esce un messaggio di errore "impossibile scaricare download_2.php dal server" in una finestra. Gli da fastidio session_start() all'inizio della pagina, se lo tolgo va ma in questo io senza sessione non potrò controllare se l'utente è autenticato!

    Se ci fosse un modo per partire l'istruzione readfile (con gli header) con un ritardo nella stessa pagina senza mandare tutto ad un'altra sarebbe perfetto!