Come posso limitare l'accesso per i file generati automaticamente a utenti specifici in una configurazione MVC?

1

Ho un tipico sito Web basato su MVC e vorrei dare ad alcuni utenti registrati la capacità di estrarre i dati dal database (in una varietà di formati). Il flusso di lavoro è molto semplice:

  • Accesso utente,
  • L'utente fa clic sull'esportazione,
  • Viene generato un file,
  • L'utente scarica il file.

Sto cercando di capire come proteggere l'ultimo passaggio e limitare l'accesso al file. Affinché l'utente possa scaricare il file, dovrebbe trovarsi in una cartella accessibile al pubblico. Ciò, tuttavia, significa che il file è accessibile a tutti gli altri che hanno accesso al proprio URL completo.

Ho pensato ad alcune possibili soluzioni:

  1. Invia per email il file di esportazione

    Invece di fare in modo che l'utente scarichi il file, potrei semplicemente inviarlo via email alla sua email (quella che hanno usato per registrarsi sul sito). Sembra un'opzione decente quando i file di esportazione sono piccoli, ma non penso che sarà ottimale per i file più grandi.

  2. .htaccess magic

    Potrei generare automaticamente un .htaccess nella directory di esportazione che permetterebbe solo all'utente che ha richiesto l'esportazione di accedervi. Anche un'opzione decente, ma è specifica del server web e basata su IP. Non so se Apache sarà sempre il server web di scelta per il progetto, e non sono sicuro che una soluzione basata su IP sia effettivamente sicura.

  3. Archivia il file di esportazione in una cartella privata e chiedi all'utente di recuperarlo tramite ftp

    Sicuro, ma non particolarmente user-friendly.

Tutte le mie opzioni sembrano avere problemi, e sono a quel punto in cui sono completamente bloccato e non riesco a scuotere la sensazione che mi manchi qualcosa di ovvio. Sono io? C'è un flusso di lavoro migliore?

Sono più interessato a una panoramica di alto livello rispetto ai dettagli tecnici, il progetto è ancora ai suoi esordi ei requisiti tecnici non sono ancora stati stabilizzati (ad esempio, non possiamo usare Apache dopo tutto). Il progetto è compilato in PHP, ma non penso che importi (vero?).

Grazie.

    
posta user2590712 13.09.2013 - 15:20
fonte

2 risposte

1

Puoi pubblicare il file tramite lo script PHP, che controlla se l'utente è autenticato.

es. pseudocodice

if session.user is loggedIn
    filename = url.filename
    if filename belongs to session.user
        fetchfile(filename)
    else
        "you are not authorized to download this file"
else
    "please log in"

quindi solo l'utente che ha richiesto l'esportazione è in grado di scaricarlo. Se un altro utente riceve l'url, non può scaricare nulla.

    
risposta data 13.09.2013 - 15:31
fonte
0

Non generare un file prima di autorizzare la richiesta. Questa potrebbe essere una operazione costosa. Innanzitutto assicurati che l'utente disponga delle autorizzazioni necessarie e quindi generi i file di conseguenza.

Dato che stai generando file al volo, perché archiviarli? Non puoi semplicemente servire i file attraverso l'oggetto risposta e dimenticarli?

    
risposta data 13.09.2013 - 17:01
fonte