• User Newbie

    Problema accessi cartella...

    Salve ragazzi,
    Sto impazzendo dietro un problemino semplice ma apparentemente insormontabile.

    Ho creato un applicazione che permette di scaricare file dietro inserimento di un apposito codice. Il file viene inviato in stream mediante questo codice:

    Set objStream = Server.CreateObject("ADODB.Stream")

    objStream.Type = 1
    objStream.Open
    objStream.LoadFromFile "e:/inetpub/wwwroot/private/file.pdf"
                            
    Response.ContentType = "octet/stream"
                            
    Response.AddHeader "Content-Disposition", "attachment;filename=" & link
    Response.BinaryWrite objStream.Read
                            
    objStream.Close
    Set objStream = Nothing
    

    Ora, il codice funziona e il file viene "inviato" all'utente.
    Il problema è che se l'utente trova il percorso del file sul server, può richiamarlo direttamente da browser, ed è una cosa che non voglio perchè il file devo inviarglielo solo io dopo che l'utente ha inserito il giusto codice.

    Allora, ho modificato i permessi della cartella dove risiedono i file, togliendo i permessi di lettura per l'utente IUSR_.
    In questo modo, l'accesso diretto da browser viene disabilitato.
    Ma il codice di cui sopra mi restituisce:

    ADODB.Stream error '800a0bba' 
     Impossibile aprire il file. 
     /infosi/site/compra.asp, line 103
    

    E mi sembra anche giusto... ma allora come faccio per poter inviare un file da dentro un'area protetta rendendo allo stesso modo impossibile scaricarlo direttamente inserendo l'url in un browser?


  • Moderatore

    Ciao GaBBianO e benvenuto nel Forum GT!
    una soluzione al tuo problema potrebbe essere fornita dal controllo del referrer della pagina richiesta (URL). Se il refferrer è il tuo sito stesso (e se una determinata variabile di sessione è settata -aggiungerei io) allora permetti il download via streaming, altrimenti (cioè se si tratta si una richiesta HTTP diretta (digitazione dell'url completo sulla barra degli indirizzi o richiesta fatta da uno spider) redirigi su una pagina di cortesia in cui avvisi che per il download è necessaria la registrazione ed essere correttemete loggati:
    Qualcosa del genere:

    
    <% 
        ref = lcase(Request.ServerVariables("HTTP_REFERER")) 
        if instr(ref, lcase("nome_del_tuo_dominio"))>0 then && Len(Session("CodiceControllo")) > 0
            SendFileViaStream(filename)  
        else 
            Response.Redirect("accesso-negato.asp")
        end if 
     
    %>
    
    

  • User Newbie

    No forse mi sono spiegato male...
    Il problema non è l'accesso al file tramite la pagina di download, ma l'accesso al file diretto.
    Voglio dire, se ad esempio il file si trova su, www.miosito.it/files/file.pdf, se tu provi a digitare questo url lui te lo fa scaricare.
    Io invece voglio che lui non lo faccia scaricare direttamente ma solo tramite una pagina che dico io, nella quale poi posos mettere tutti i controlli del caso.


  • Moderatore

    Prova a fare tutti controlli del caso (referrer, codici di controllo, ecc) nelle funzioni Application_OnStart e Session_OnStart del file global.asa
    posto nella root del tuo web server (non credo serva a molto in quanto i tuoi file da scaricare non hanno l'estensione.asp - a meno che non la modifichi manualmente...)

    Altrimenti ti rimane poco da fare:

    1. Complicare gli url con nomi di directory moolto lunghi pieni di caratteri incomprensibili (tipo ID di Sessione)
    2. Cambiare (e crittografare) il nome e l'estensione del file in modo che non sia possibile il download, un sistema (veramente banale) potrebbe essere:

    per esempio: myfile.pdf >> myfile_fdp.asp
    myArchive.zip >> myArchive_piz.asp
    ecc...

    per i download "controllati" poi rimetti tutto a posto via codice:
    myfile_fdp.asp >> myfile.pdf
    myArchive_piz.asp >> myArchive.zip
    ecc...