PDA

View Full Version : [php] consenti solo da...


jake101
13-09-2010, 18:04
Ciao a tutti.
Ho bisogno di una mano per uno script php:
- Ho un lettore flash per video e musica da mettere nel sito A.
- Ho i video e la musica nel sito B (altro dominio, altro server).
- Il lettore in flash richiede i link diretti (dominiob.com/files/video1.flv o music.mp3) o anche i link gestiti da uno script php (es: http://dominiob.com/play.php?f=video1.flv)
Fin qui nessun problema. Nel dominio e server B dove sono hostati i files, voglio permettere l'apertura degli flv/mp3 solo da un referer specifico.
Cioè:
http://dominioA.com/player/player.swf PUO' accedere a http://dominioB.com/files/musica1.mp3; musica2.mp3; video1.flv etc...

ma un download manager o grabber tipo orbit NON PUO' accedere direttamente al file. anche se qualcuno sa l'url non può accedervi, a meno che questo non sia il lettore.

A tal proposito è possibile fare qualcosa in PHP che collega ai file tipo mp3 o flv solo se a richiederli è il dominioA/percorsodelplayer?
So che mi sono espresso male ma ho un po di fretta.

Grazie!

dojolab
13-09-2010, 19:29
Ciao a tutti.
Ho bisogno di una mano per uno script php:
- Ho un lettore flash per video e musica da mettere nel sito A.
- Ho i video e la musica nel sito B (altro dominio, altro server).
- Il lettore in flash richiede i link diretti (dominiob.com/files/video1.flv o music.mp3) o anche i link gestiti da uno script php (es: http://dominiob.com/play.php?f=video1.flv)
Fin qui nessun problema. Nel dominio e server B dove sono hostati i files, voglio permettere l'apertura degli flv/mp3 solo da un referer specifico.
Cioè:
http://dominioA.com/player/player.swf PUO' accedere a http://dominioB.com/files/musica1.mp3; musica2.mp3; video1.flv etc...

ma un download manager o grabber tipo orbit NON PUO' accedere direttamente al file. anche se qualcuno sa l'url non può accedervi, a meno che questo non sia il lettore.

A tal proposito è possibile fare qualcosa in PHP che collega ai file tipo mp3 o flv solo se a richiederli è il dominioA/percorsodelplayer?
So che mi sono espresso male ma ho un po di fretta.

Grazie!

No non ti sei espresso male.
Puoi fare uno script PHP che va a caricare il video, per esempio:

player.php?id=12345

e passi l'ID del video; eviterei ID numerici, starei sugli alfanumerici, un pò come fa YouTUBE.

I video li puoi mettere tutti in una directory e proteggerla con .htaccess e mod_rewrite di PHP, senza dare accesso dall'esterno (salvo quello di digitare correttamente l'URL; inoltre penso che tramite Apache puoi limitare questa cosa anche...).

Successivamente che fai? Niente nel tuo file player.php controlli la provenienza della richiesta e carichi la risorsa (il video).

Questa è una idea veloce e rozza saltata al momento in mente che funziona; se mi viene in mente qualcosa di più raffinato te lo scrivo ;)

jake101
13-09-2010, 22:07
No non ti sei espresso male.
Puoi fare uno script PHP che va a caricare il video, per esempio:

player.php?id=12345

e passi l'ID del video; eviterei ID numerici, starei sugli alfanumerici, un pò come fa YouTUBE.

I video li puoi mettere tutti in una directory e proteggerla con .htaccess e mod_rewrite di PHP, senza dare accesso dall'esterno (salvo quello di digitare correttamente l'URL; inoltre penso che tramite Apache puoi limitare questa cosa anche...).

Successivamente che fai? Niente nel tuo file player.php controlli la provenienza della richiesta e carichi la risorsa (il video).

Questa è una idea veloce e rozza saltata al momento in mente che funziona; se mi viene in mente qualcosa di più raffinato te lo scrivo ;)
beh questo è abbastanza elaborato :)
il fatto è che io lo userò per le canzoni.,
è un player con una playlist. quindi quando apri index.html che contiene il file flash ti viene scritto l'elenco delle canzoni ascoltabili. la playlist in xml contiene nome traccia e link. ed è quel link che io devo proteggere in modo da impedire download inautorizzati. le url inserite nella playlist devono puntare al file mp3 tramite link diretto o script in php (che a sua volta risolverà la mia richiesta e collegherà il player al file). Però non voglio che qualcuno al di fuori del player possa scaricare il file. non so se sia possibile. il mio problema non è quindi come riprodurre i file, ma come proteggerli da download non autorizzati.

Non so se sia possibile far scaricare i file solo da un dominio specifico...
spero di aver migliorato la comprensibilità!
grazie x la risposta

!fazz
14-09-2010, 11:04
quello lo fai configurando in maniera oppurtuna il file .htaccess presente nella cartella degli mp3 in questo modo solo chi è autorizzato può accedere alla cartella con username e pwd

http://server.html.it/articoli/leggi/934/i-file-htaccess-in-apache/

jake101
14-09-2010, 21:05
quello lo fai configurando in maniera oppurtuna il file .htaccess presente nella cartella degli mp3 in questo modo solo chi è autorizzato può accedere alla cartella con username e pwd

http://server.html.it/articoli/leggi/934/i-file-htaccess-in-apache/

Grazie per la risposta, ma...
io non devo far accedere gli utenti con username e password,
voglio che a quella directory possa accedere solo il player (in un altro server) e se qualcuno si connette anche sapendo il link gli esca un errore tipo Forbidden.

probabilmente sono io che mi sono spiegato e continuo a spiegarmi male...

vladix
14-09-2010, 22:18
la soluzione secondo me è un controllo sull'ip

flx2000
15-09-2010, 09:23
la soluzione secondo me è un controllo sull'ip

Esatto.
Basta scrivere uno script PHP che fornisce il file mp3 solo se la richiesta è stata fatta dall'indirizzo IP in cui è posizionato quel Flash.

jake101
15-09-2010, 14:42
Esatto.
Basta scrivere uno script PHP che fornisce il file mp3 solo se la richiesta è stata fatta dall'indirizzo IP in cui è posizionato quel Flash.

però non so se poi gli utenti potranno aprire il music player e ascoltare le canzoni se metto un controllo sull'ip...

E' facile scriverlo?

!fazz
15-09-2010, 15:24
Grazie per la risposta, ma...
io non devo far accedere gli utenti con username e password,
voglio che a quella directory possa accedere solo il player (in un altro server) e se qualcuno si connette anche sapendo il link gli esca un errore tipo Forbidden.

probabilmente sono io che mi sono spiegato e continuo a spiegarmi male...

appunto il forbidden è l'errore che da quando si sbaglia usr e pwd :D se tu blocchi l'accesso via htaccess nessuno riesce ad accedere a meno che non abbia username e password in questo modo nessuno scarica e deve passare dal player

jake101
15-09-2010, 18:28
appunto il forbidden è l'errore che da quando si sbaglia usr e pwd :D se tu blocchi l'accesso via htaccess nessuno riesce ad accedere a meno che non abbia username e password in questo modo nessuno scarica e deve passare dal player
il fatto è che vorrei tenere aperto l'accesso per il player.
è come se tu hai un direct link di un mp3 con htacess + password e metti il link su Windows Media o VLC... non funziona! invece io devo farlo fare funzionare ma allo stesso tempo non farmi fregare le canzoni

!fazz
16-09-2010, 13:30
il fatto è che vorrei tenere aperto l'accesso per il player.
è come se tu hai un direct link di un mp3 con htacess + password e metti il link su Windows Media o VLC... non funziona! invece io devo farlo fare funzionare ma allo stesso tempo non farmi fregare le canzoni

aspetta che non ci siamo capiti

allora con htaccess neghi l'accesso alla cartella a chi vuoi tu, basta che fai in modo che il player sia grant

flx2000
16-09-2010, 14:03
Nel momento in cui trasferisci uno stream di qualsiasi tipo ad un player locale l'utente è SEMPRE in grado di salvare i tuoi file, anche se li proteggi da 2000 password.

Al massimo non saprà il nome che hai dato a quel file e la sua posizione sul tuo server, ma se glielo passi via streaming non c'è niente che tu possa fare per impedirgli di salvarlo (ad esempio utilizzando il semplice VLC).

Non è che hai molte alternative. Motivo per cui sui siti ufficiali non trovi mai i brani completi ma sempre versioni a qualità ridotta o troncate.

jake101
19-09-2010, 22:23
ok grazie!

cionci
20-09-2010, 08:48
Gli accorgimenti che si possono prendere sono molteplici:
- nascondere i file dietro ad uno script php (quello consigliato da dojolab)
- controllo del referer
- controllo di una variabile nella sessione

Possono anche essere presi tutti e tre contemporaneamente.

Prima di tutto devi creare uno script php che astrae i file .mp3 o qualsiasi altro file tu voglia creare.
I file dovranno essere spostati in una directory non accessibile tramite web o non accessibile direttamente (bloccando l'accesso tramite la richiesta di una password ad esempio) e dovranno essere memorizzati con il nome uguale ad un id numerico. Questo id numerico è il riferimento assegnato all'interno di un database al momento dell'aggiunta di un file (all'id corrisponderanno tutte le caratteristiche del file: nome esatto, durata, tipo del file, autore, etc etc).
Lo script riceva tramite GET l'id di un file. Verificherà l'esistenza di una sessione e di una variabile di sessione che autorizza l'utente ad accedere a quel dato file (in caso contrario nega l'accesso). Andrà a recuperare il tipo del file dal database, imposterà il mime-type (primo commento a questo link (http://php.net/manual/en/function.header.php)) corrispondente al tipo del file e andrà ad aprire direttamente il file e a darlo in output.
La parte di recupero del file puoi vederla qui: http://www.hwupgrade.it/forum/showpost.php?p=32918519&postcount=10
Non fa la stessa cosa, perché lì si va ad aprire un url, ma alla fine è molto simile:
- controlli il referer (deve essere uguale ad un variabile impostata nella sessione) e controlli l'autorizzazione ad accedere a quel file (qui sarai tu a decidere come concedere l'autorizzazione). Questo impedisce di scaricare senza passare dalla pagina precedente l'accesso al file.
- recuperi il tipo del file dal DB in base all'id e setti il mime-type (se ti interessa nascondere solo un tipo puoi saltare questo passo e settare solo il mime-type)
- dai in output il file specificato con readfile

dojolab
20-09-2010, 09:00
Prima di tutto devi creare uno script php che astrae i file .mp3 o qualsiasi altro file tu voglia creare.
I file dovranno essere spostati in una directory non accessibile tramite web o non accessibile direttamente (bloccando l'accesso tramite la richiesta di una password ad esempio) e dovranno essere memorizzati con il nome uguale ad un id numerico. Questo id numerico è il riferimento assegnato all'interno di un database al momento dell'aggiunta di un file (all'id corrisponderanno tutte le caratteristiche del file: nome esatto, durata, tipo del file, autore, etc etc).
Lo script riceva tramite GET l'id di un file.

Posso permettermi un consiglio per migliorare la sicurezza?
Io in GET passerei un hash dei file; provo a spiegarmi meglio.

video.php?id=c21a7f50739500292ab24dd37150fa8a

c21a7f50739500292ab24dd37150fa8a NON corrisponde all'ID diretto sul DB del video.
Creerei quindi una tabella (relazioni) con ID/NOME video (quello che risiede direttamente su disco, ID, nome, quello che usi per riconoscerlo) e l'ID passato come parametro del GET (c21a7f50739500292ab24dd37150fa8a appunto).

Perchè? Semplicemente non dai un riferimento diretto ad un utente visitatore al video sul Server.
Puoi usare una banalissima codifica md5/sha1, serve solo per 'mascherare' la reale posizione/nome/id del video e poi, diciamolo, fa cooool :P vedere un qualcosa del tipo /video/c21a7f50739500292ab24dd37150fa8a :D

cionci
20-09-2010, 09:21
Non credo che possa aggiungere sicurezza, visto che passare sempre lo stesso hash o sempre lo stesso id sarebbe comunque equivalente ;)

Allora sarebbe più bello codificare l'id con una one time password creata all'inizio alla creazione della sessione. Ecco, in questo modo si aggiunge sicurezza perché il link al file cambia sempre ad ogni nuova sessione.
Ad esempio, si genera una one time password in base a nome utente e un numero casuale e la si salva nella sessione (non transiterà quindi mai verso l'utente).
Questa one time password viene usata come chiave per codificare l'id del file (opportunamente allungato aggiungendo un numero di cifre davanti fino a raggiungere un lunghezza prefissata, ad esempio 10).
Ovviamente bisogna usare un algoritmo di cifratura adatto.

dojolab
20-09-2010, 09:29
Non credo che possa aggiungere sicurezza, visto che passare sempre lo stesso hash o sempre lo stesso id sarebbe comunque equivalente ;)

Non saprei, alla fine 'maschero' il reale nome del file.
Ecco, sicuramente devo farmi una JOIN per ritirarmi fuori il nome vero, perdendo comunque quel 0.00001s di prestazioni :P


Allora sarebbe più bello codificare l'id con una one time password creata all'inizio alla creazione della sessione. Ecco, in questo modo si aggiunge sicurezza perché il link al file cambia sempre ad ogni nuova sessione.
Ad esempio, si genera una one time password in base a nome utente e un numero casuale e la si salva nella sessione (non transiterà quindi mai verso l'utente).
Questa one time password viene usata come chiave per codificare l'id del file (opportunamente allungato aggiungendo un numero di cifre davanti fino a raggiungere un lunghezza prefissata, ad esempio 10).
Ovviamente bisogna usare un algoritmo di cifratura adatto.

Soluzione decisamente più elegante, ottimo suggerimento ;) non ci avevo pensato (e la cosa è molto grave :D)

cionci
20-09-2010, 09:34
Non saprei, alla fine 'maschero' il reale nome del file.
Tanto il file non è accessibile dall'esterno. Senza contare che potrei aggiungere un prefisso al file o aggiungere altri dati, come ad esempio un timestamp (potrei dare il nome al file con timestamp_id). Ovviamente posso recuperare il timestamp associato all'id dal DB.

dojolab
20-09-2010, 09:38
Tanto il file non è accessibile dall'esterno. Senza contare che potrei aggiungere un prefisso al file o aggiungere altri dati, come ad esempio un timestamp (potrei dare il nome al file con timestamp_id). Ovviamente posso recuperare il timestamp associato all'id dal DB.

Vero, però l'utente potrebbe 'switchare' tra un video e l'altro cambiando l'id.
Un pò come avviene nel configuratore Dell, provare per credere :D

cionci
20-09-2010, 09:43
Vero, però l'utente potrebbe 'switchare' tra un video e l'altro cambiando l'id.
Un pò come avviene nel configuratore Dell, provare per credere :D
Se l'utente è autorizzato non mi sembra un problema (la verifica dell'autorizzazione deve sempre essere stata fatta). In ogni caso semplicemente cambiare id dal browser non funziona perché mancherebbe il campo referrer alla richiesta.

Allora facciamo così: trasmettiamo l'id del video tramite variabile di sessione e non ne parliamo più :D

dojolab
20-09-2010, 09:55
Se l'utente è autorizzato non mi sembra un problema (la verifica dell'autorizzazione deve sempre essere stata fatta). In ogni caso semplicemente cambiare id dal browser non funziona perché mancherebbe il campo referrer alla richiesta.

Siamo sicuri? :D
Il deve lo cambierei in dovrebbe :P (nel senso che molti non lo fanno)


Allora facciamo così: trasmettiamo l'id del video tramite variabile di sessione e non ne parliamo più :D

Affare fatto. :D

jake101
21-09-2010, 18:05
Ragazzi grazie mille delle risposte...
ma detta come va detta:
di PHP e MySQL non so un accidente!

ahah come potrei fare senza scervellarmi troppo?

Ripeto quello che ho e quello che voglio:

- Ho un player musicale in SWF che gestisce tramite una apposita playlist messa all'interno i file MP3 da caricare.

- Il player consente di caricare i file da un determinato percorso o da un server differente, indicando semplicemente l'URL o utilizzando uno script in PHP che gestisce la richiesta.

Es: XML etc...
<Track1> !-- ordine della traccia (in questo caso la 1a)--!
<trackURL: !--indirizzo url della traccia MP3--!>
<Artist=> !--artista della traccia--!
<Name=> !--nome della canzone--!
es con link URL diretto
<Track1=http://miohost.com/music/file.mp3>
es con link url a script PHP che poi provederà a richiamare il file corretto:
<Track1=http://miohost.com/music/play.php?f=file.mp3>
**Tutto ciò per dirvi che posso utilizzare gli script in PHP per richiamare i files.

- Ho un host che contiene i files MP3.


VOGLIO:

- Che il player riproduca le canzoni inserite :)
- Che lo user anche se sa il link diretto della canzone non possa aprirla
- Che lo user anche se usa lo script PHP con il relativo ID della canzone non possa aprirla
- Che lo script php identifichi la provenienza della richiesta. Se tale richiesta proviene da http://miosito.com/play allora rilascia il file richiesto, altrimenti NO..

So che posso essere duro di comprendonio, ma ne ho bisogno davvero e non so fare niente in PHP e MySQL (DB)

cionci
21-09-2010, 18:24
Potrebbe essere una buona occasione per imparare il php...

jake101
21-09-2010, 20:29
Potrebbe essere una buona occasione per imparare il php...

Ahah ho solo 18 anni senza contare che ho anche la scuola...

dojolab
21-09-2010, 20:57
Ahah ho solo 18 anni senza contare che ho anche la scuola...

Per fare ciò che chiedi ti basta:


una IF
un GET
una SELECT con WHERE e AND
e una buona nozione sulla sicurezza (XSS, SQL Injection)


PS. Alla sera non c'è scuola, come non c'è nei week.
Dai forza e coraggio, ti ho già detto tutto.

cionci
21-09-2010, 21:38
Ahah ho solo 18 anni senza contare che ho anche la scuola...
A 18 anni io sapevo già programmare in C, Basic, Pascal e qualcosa di C++.
Quindi rimboccati le maniche e studiatelo avanza tempo ;)

Visto che hai 18 anni potresti anche scoprire che ti piace programmare. Quindi l'esperienza potrebbe essere utile per il tuo futuro.

jake101
24-09-2010, 22:00
ahah ok grazie!