2012-05-24 9 views
8

Sto lavorando per sviluppare un sito Web che consente ai client di accedere e vedere vari PDFs salvati sul server. Questi PDF saranno unici per il cliente e non dovrebbero essere accessibili da qualcuno che non ha effettuato l'accesso. Ottenere i file sul server non dovrebbe essere un problema, non sono sicuro su come servirli agli utenti finali.Creazione di un server di archiviazione file sicuro per PDF

Ho implementato questo tipo di cose con i dati da SQL servers in esecuzione invece dei file, quindi non sono del tutto sicuro di quale sia il modo più efficace per farlo.

Il sito è in un LAMP e la mia esperienza minima è in PHP (ma se un quadro o altra lingua renderebbe questo più facile, posso imparare).

Probabilmente sono sopra la mia testa ma di solito lo sono, quindi qualsiasi input sarebbe fantastico.

risposta

9

Inserire i file al di fuori del webroot. Quindi usando PHP passa il file attraverso uno script. In questo modo nessuno può collegarsi direttamente al file e ignorare i controlli. (Assicurati ovviamente che lo script che lo fa solo dopo aver verificato che l'utente abbia il permesso di recuperare quel file).

PHP di esempio:

<?php 
    session_start(); 
    if (!isset($_SESSION['authenticated'])) { 
     exit; 
    } 
    $file = '/path/to/file/outside/www/secret.pdf'; 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=' . basename($file)); 
    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($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

caso non 'session_start();' caricare? Suppongo che dovrebbe funzionare con le sessioni. –

+0

In realtà, sì, dovrebbe essere. Ero così concentrato sul concetto di base che non ho fornito un esempio veramente completo. Ora correggo che ... –

+0

Basta controllare ;-) –

4

Il modo più semplice è quello di dare a questi file nomi di file lunghi casuali (diciamo, 20 caratteri casuali). Tecnicamente saranno accessibili a chiunque, ma non sarà possibile indovinare l'URL, quindi solo le persone autorizzate avranno accesso.

In alternativa, John Conde ha già delineato un modo per pubblicare un file da uno script PHP. Dovrà sostenere una piccola penalità per le prestazioni, ma sarà sicuro quanto il tuo codice. L'unica cosa che posso aggiungere è che se non puoi metterli fuori da webroot, allora potresti essere in grado di usare .htaccess per impedire alle persone di accedere direttamente ai file.

+1

Vorrei suggerire GUID. Questo ha ancora il problema di poter eseguire il ping del server fino a quando non ottengo qualcosa di interessante, anche se puoi rendere le possibilità di successo incredibilmente piccole. Sostengo l'uso di .htaccess per bloccare l'accesso alla cartella. – zebediah49

+1

@ zebediah49 - È una possibilità, ma [ci sono delle trappole] (http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx) di cui dovresti essere a conoscenza. La semplice generazione di una stringa casuale è più sicura. E, se vuoi essere sicuro al 110%, usa un generatore di numeri casuali crittograficamente forte. –

+0

Molto interessante, grazie. Ho scelto GUID per la lunghezza, ma eviterei comunque l'utilizzo di URL accessibili pubblicamente, ma questo è un ottimo punto. – zebediah49

2

John ha pubblicato il modo corretto per farlo, quindi sto aggiungendo l'alternativa (probabilmente inferiore): Servitela dal database. Basta avere una colonna BLOB per il PDF e leggere/memorizzare i dati del file dal database. Finirai con un tavolo abbastanza grande, ma funzionerà. Per servirlo è necessario impostare lo stesso header() come inviato da John, basta inviare i dati dal DB anziché dal file.

Questo ha il vantaggio di non dover essere sicuri di non avere collisioni nome del file, ecc

Problemi correlati