filtri per download file

Ho un file che vorrei sia scaricabile solo da chi si logga e ha determinati diritti.

Ne consegue che deve essere impedito il download anche se si conosce l’url del file se non ci si è prima loggati.

Come si fa?!?

un solo file o programmi di avere un’intera sezione download?

scusa non ho capito la domanda.

Comunque parlo di n file scaricabili da n utenti con uno specifico ruolo in una webapplication php (YII ovviamente )

Ma non devono essere scaricabili direttamente dal link senza una preventiva autenticazione e verifica delle loro credenziali.

Mi sto rispondendo da solo.

Forse la soluzione è scritta quà link

dove fanno vedere che per scaricare ad esempio un mp3 bisogna redirezionare il browser su uno script php tipo questo:





$fileonly=$_GET['param']; 

$file="../music/".$fileonly; 


header('Cache-Control: no-cache'); 

header('Cache-Control: no-store'); 

header('Pragma: no-cache'); 

header('Content-Type: audio/x-mp3'); 

header('Content-Length: ' . filesize($file)); 


$fh = fopen($file,"rb"); 

while (!feof($fh)) { print(fread($fh, filesize($file))); } 

fclose($fh); 




I file stanno un una cartella non pubblica e vengono mandati al browser nel flusso della risposta http tramite print di php.

Ma se non so a priori il tipo di file che sto servendo? invece di audio/x-mp3 cosa devo mettere?

application/octet-stream? (MIME)

boh devo provare

ciao Proid la tua è una bella domanda.

io ho risolto cosi.

nella cartella dove risiedono i file ci metti una bella direttiva in cui neghi l’accesso conoscendo percorso e nome del file.

crei un file .htaccess e inserisci dentro una cosa di questo tipo:




<Files ~ "^\.(htaccess|htpasswd)$">

deny from all

</Files>

Options Indexes

ErrorDocument 400 Permesso Negato. La tua richiesta è stata registrata.

order deny,allow



il problema si pone se sono un utente autorizzato a vedere "solo il mio file" e cerco di vedere quello degli altri. In questo caso penso che riuscirei a prendere in giro il "sistema".

Il modo per ovviare a cio’ è che il personaggio loggato abbia registrati i file a cui puo’ aver accesso. In questo caso, che si possano controllare i download effettuati dall’utente.

Ciao usare la basic authentication per filtrare gli accessi non credo sia molto sicuro e poi dovrei dividere le cartelle per utente e fare il filtraggio con htpasswd invece che lato php ad esempio usando i filters nel controller.

Poi c’è il problema che hai fatto presente tu di non permettere il download di file di altri (es. file dichiarati pubblici dal porprietario).

Se trovi una soluzione migliore rendimi partecipe.

;D

Io con .htaccess ho negato l’accesso diretto alla cartella sul server non ho effettuato alcun filtro.

Quali problemi di sicurezza potrebbero esserci?

;)

qualche giorno fa ho terminato un progetto per consentire a dei clienti di accedere ad aree riservate con la possibilità di visualizzare i doc disponibili ed alcuni prototipi web.Per la visualizzazione dei doc e la forzatura del download puoi fare qualcosa dl genere…




public function actionIndex()

	{		

		if($_GET)

		{			

			$path = Yii::getPathOfAlias('webroot.clienti.'.$this->user.'.'.$this->folder);

			$download =  $path.DIRECTORY_SEPARATOR.$this->file;

		}

			return Yii::app()->getRequest()->sendFile(basename($download), @file_get_contents($download));

	}

Ogni cartella cliente è protetta de un semplice htaccess nella cartella padre che nega l’accesso diretto alle cartelle.

Per l’accesso al sistema ho utilizzato l’auth semplice però con la memorizzazione nel DB…dove ho messo anche alcuni riferimenti al cliente…tipo il nome cartella…

Mi sembra ottimo, la logica credo sia la stessa dei sample che ho trovato in rete ma tu fai uso del framework.

Sei partito dalle API Yii o hai trovato esempi nel forum?

grazie mille!

ovvio che utilizzo il framework :)

L’applicativo è scritto totalmente in yii.In rete si trovano molti tutorial sull’argomento ma in questo modo il tuo codice risulta molto più pulito ed ordinato.Puoi creare un’estensione dedicata e poi riutilizzarla ogni volta che vuoi ,senza sporcarti le mani :) .

La soluzione che ho adottato non risolve tutti i problemi di sicurezza relativi all’accesso diretto ai file.Devi comunque proteggere la tua cartella clienti con un htaccess ricorsivo.Oppure puoi pensare ad una procedura che generi dei link a scadenza(giorn ,sett, mens)…un’approccio molto utilizzato da grossi fornitori per i propri clienti.

se hai bisogno nn esitare

Beh dato che mi autorizzi, nel mio pensare a situazioni particolari mi è nato un problema…

Con questa soluzione si può fare in modo che ad esempio una view trasmetta nella risposta http un file del filesytem.

Questo vuol dire che teoricamente potrei fare una pagina web dove nel tag img possa puntare tramite l’attributo src a questa view che mi spara l’immagine nella pagina? … oppure posso solo fare il download del file?

Proseguendo e complicando ulteriormente … con active record posso inserire i file in upload nel database invece che nel filesystem?

Non so quanto sia conveniente mettere le immagini nel database invece che nel filesystem… mi è venuto in mente per rendere più facile il backup e la sincronizzazione di più server in HA… dovrei solo mettere in replica i database senza dovermi preoccupare della sincronizzazione delle cartelle che contengono le immagini uploadate.

Chiudendo il cerchio in questo modo uploado un file e lo deposito nel dataabse, vedo l’alteprima del file (immagine) in una view, lo scarico e infine faccio backup/sincronizzazione dei dati dell’intero sito solo tramite il database.

E’ uno scenario realistico secondo te o nella pratica lavorare solo con il database è impraticabile e conviene mettere i file nel filesystem?

puoi fare solo il download dell’immagine ma questo non vieta l’utilizzo di una vista per visualizzare l’anteprima dell’immagine.Per farti un esempio ,con il metodo utilizzato nel mio caso il click su un file passa per una action .Non è un semplice riferimento ad una specifica posizione della cartella.Questo è fatto per non dare riferimenti ad utenti smaliziati che cercano di capire la struttura delle directory e tentare un accesso diretto al file.

si c’è un wiki specifico e lo trovi qui

il modo migliore per immagazzinare le immagini è nelle directory ed immagazzinare solo il nome dell’immagine nel database.In questo modo il database non cresce in maniera esponenziale e soprattutto è più facile da gestire.

i campi blob non li ho mai utilizzati ma laddove dovesse presentarsi la necessità(applicativi di spessore), potrebbero essere una soluzione.Tutto questo a patto che le immagini siano iper-ottimizzate…Se i tuoi file sono di dimensioni ragionevoli allora potrebbe essere un’alternativa…che cmq sconsiglio vivamente!

Ottimo grazie mille.

In effetti con molti oggetti blob nel db la manutenzione del database diventerebbe molto onerosa, magari è un discorso che si potrà fare nella versione 2 di Yii quando saranno pienamente supportati i database non relazionali come ad esempio Cassandra… e saranno a loro volta supportati massivamente dai fornitori di hosting