Newsgroup: it.comp.www.php
Titolo: protezione accesso

Buongiorno e scusate se la domanda � stupida...
Ho fatto un semplice sistema di autenticazione basato sulle sessioni.
Username e password (md5) in mysql.
Se l'utente � abilitato accede a dei pdf (o ad un contenitore swf, non ho
ancora deciso).
Il problema � che attualmente se si digita direttamente sulla barra degli
indirizzi o il nome pdf o il nome swf si bypassa il login.
Come potrei fare?
Qualunque aiuto � gradito.
Grazie a tutti

 Qualunque aiuto è gradito.
impedisci l'accesso diretto a quel tipo di file (o alla directory che li 
contiene) direttamente da webserver.
invetati un meccanismo per far fare il download del file tramite uno 
script + dati nel db.
ad esempio, nel db hai la tabella con i file disponibili al dload
id_file|path_al_file|nome_file
il link per fare il dload ad un determinato nome_file diventa
script_download.php?file=XXX
dove XXX è l'id_file della tabella sopra
in script download fai le seguenti cose:
recuperi dal db nome_file e path_file tramite l'id del file, solo se  si 
è loggati (poi in un secondo momento puoi pensare anche di fare delle 
acl).
leggi il file $path_file.$nome_file
forzi il dload del file tramite header http
una roba tipo:
		// Generate the server headers
		if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
		{
			header('Content-Type: "'.$mime.'"');
			header('Content-Disposition: attachment; 
filename="'.$filename.'"');
			header('Expires: 0');
			header('Cache-Control: must-revalidate, post-
check=0, pre-check=0');
			header("Content-Transfer-Encoding: binary");
			header('Pragma: public');
			header("Content-Length: ".strlen($data));
		}
		else
		{
			header('Content-Type: "'.$mime.'"');
			header('Content-Disposition: attachment; 
filename="'.$filename.'"');
			header("Content-Transfer-Encoding: binary");
			header('Expires: 0');
			header('Pragma: no-cache');
			header("Content-Length: ".strlen($data));
		}
 
		exit($data);
dove $data è il contenuto del file (letto magari tramite una 
file_get_contents), mime è il mime type del file, $filename è il nome del 
file con il quale vuoi far fare il dload all'utente (che puo' essere 
diverso dal reale nome del file)

 file_get_contents)
[...]
Mi inserisco qui per una delucidazione. A livello di performance, in
base anche alla dimensione dei file, è migliore file_get_contents o fread ?
saluti,
M.

 fread ?
http://php.net/manual/en/function.file-get-contents.php
"file_get_contents() is the preferred way to read the contents of a file 
into a string. It will use memory mapping techniques if supported by your 
OS to enhance performance."

 fread ?
Corretta la risposta di RedWiz, ma dipende anche cosa devi farci.
file_get_contents piazza tutto il file in RAM, quindi se e` grosso rischi 
anche di superare il limite di memoria del php.ini
fread lo legge un pezzo alla volta (delle dimensioni che definisci tu).
Se devi semplicemente inviarlo al browser, meglio usare fpassthru.
Bye.

Al di là delle performance (per quanto il manuale PHP consiglia di usare 
file_get_contents), il problema è che entrambe leggono il file e lo 
caricano in una variabile (o comunque in memoria). Questo significa che 
la dimensione massima del file che puoi leggere è dettata dal memory 
limit della tua configurazione: oltre questo limite lo script viene 
bloccato e il file ti arriva troncato.
Ho affrontato questo problema l'anno scorso e posso dirti che non c'è 
soluzione (lato PHP), a meno che non limiti i file a tot Mb.
Io avevo il problema di dover inviare anche file di 20Gb...
L'unica cosa che puoi fare è di utilizzare dei moduli speciali sul 
webserver (come il mod_xsendfile di lighttpd o di Apache) a patto che tu 
possa mettere mano nei file di configurazione e (nel caso di Apache) 
ricompilare modulo (scritto in C) e webserver.
Spero di esserti stato di aiuto.
- Antonio


Allego la pagina del progetto per Apache: 
https://tn123.org/mod_xsendfile/
L'esempio è chiarissimo, inoltre verificato con Wireshark il percorso 
reale del file non viene rivelato.

 wrote:

Puoi usare readfile(), che è stato definito apposta per il download dei file
disciplinato da PHP.
Per ulteriori dettagli, qui ho messo tutta la mia scienza riguardo sul
tema del download:
http://www.icosaedro.it/articoli/php-file-download.html
L'aspetto più spinoso è la corretta codifica del file name quando contiene
caratteri non ASCII: si accettano commenti.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

			header("Content-Length: ".strlen($data));
Solo una cosa. Ti conviene fare:
	// All'inizio
	ob_start();
	error_reporting(E_ALL);
	$length	= filesize($filename);
	$status	= ob_get_contents();
	if ('' != $status)
	{
		... ahi.
	}
	ob_end_clean();
	...
	Header("Content-Length: $length");
	readfile($filename);
Oppure, se vuoi supportare Range, fpassthru. Anche Last-Modified puo'
essere una buona idea, a livello di user experience.
Prima o poi bisognerebbe scrivere una funzione che metta tutto quanto
insieme...
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!


Penso di aver risolto...
nell'htaccess ho inserito:
RewriteCond %{HTTP_REFERER} !^
http://www.miosito/login.php$
RewriteRule file.swf 
http://www.miosito/index.php
 [R=301,L]
Cosa ne pensate, può andare?

 Cosa ne pensate, può andare?
Che se mi dai l'indirizzo del sito ti scarico tutti gli swf che mi pare.
Esempio:
wget --referer="
http://www.miosito/login.php
" 
http://www.miosito/blabla/
file.swf
È una soluzione bucabilissima, ma anche se non lo fosse, è davvero 
brutta , per più di un motivo.
Leggiti per bene il thread e parti da li. 
Magari fai altre domande, ma andare a tentativi senza conoscere la teoria 
e senza essere un minimo navigato ti porta poco lontano.
 

 Corretta la risposta di RedWiz, ma dipende anche cosa devi farci.
Io ricado nel caso di file binari piuttosto piccoli ma, a volte, molto
numerosi. E i file finiscono sul db.
Quindi ad essere sincero non so se le performance siano legate al file
system (e alla lettura del file, da cui la mia domanda) o al db.
L'esperienza e l'intuito mi dicono il db. Per cui l'utilizzo di una o
l'altra funzione di lettura file sarebbe ininfluente...