2011-08-19 10 views
32

Mam stronę internetową, na której użytkownicy powinni być w stanie zalogować się i słuchać utworu (samodzielnie utworzonego pliku mp3). Chcę, aby zalogowany użytkownik mógł nasłuchiwać/pobierać/cokolwiek, a plik powinien znajdować się na serwerze (nie może być przechowywany w bazie danych MySQL), ale nie może być dostępny dla użytkowników, którzy nie mają ścieżki do adresu URL.PHP: Jak mogę zablokować bezpośredni dostęp do adresu URL do pliku, ale nadal zezwalam na pobieranie przez zalogowanych użytkowników?

Na przykład: powiedz, że mój mp3 znajduje się na stronie mysite.com/members/song.mp3 Jeśli jesteś zalogowany, powinieneś zobaczyć stronę mysite.com/members/index.php, która umożliwi dostęp do pliku song.mp3. Jeśli nie jesteś zalogowany, strona mysite.com/members/index.php nie wyświetli pliku song.mp3, a bezpośrednie połączenie z nim nie powinno dawać dostępu.

Jestem prawie pewny, że odbywa się to za pomocą htaccess, a ja już sporo zrobiłem i szukam tutaj. Dwie najbliższe odpowiedzi, które znalazłem, to ten przewodnik htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ i to pytanie StackOverflow Block direct access to a file over http but allow php script access, ale nie odpowiadam na wszystkie moje pytania, aby spełnić moje kryteria. czego mi brakuje?

Odpowiedz

53

do folderu członkowie utworzyć nowy folder pliki, przesuwania tu wszystkie swoje utwory, tworzyć nowe .htaccess plik i dodaj następujące linie:

Order Deny,Allow 
Deny from all 


W folderze członkowie utwórz plik get_song.php i dodaj następujący kod:

if(!empty($_GET['name'])) 
{ 
    // check if user is logged  
    if(is_logged()) 
    { 
    $song_name = preg_replace('#[^-\w]#', '', $_GET['name']); 
    $song_file = "{$_SERVER['DOCUMENT_ROOT']}/members/files/{$song_name}.mp3"; 
    if(file_exists($song_file)) 
    { 
     header('Cache-Control: public'); 
     header('Content-Description: File Transfer'); 
     header("Content-Disposition: attachment; filename={$song_file}"); 
     header('Content-Type: application/mp3'); 
     header('Content-Transfer-Encoding: binary'); 
     readfile($song_file); 
     exit; 
    } 
    } 
} 
die("ERROR: invalid song or you don't have permissions to download it."); 


A teraz, można użyć tego adresu, aby pobrać plik piosenka:
http://mysite.com/members/get_song.php?name=my-song-name

+0

To działało, dziękuję bardzo! – Bing

+2

Zamiast odmawiać bezpośredniego dostępu, możesz przechowywać plik poza wwwroot. –

+0

To działało dla mnie :) dzięki ... –

3

Czy używasz języka skryptowego, takiego jak PHP do obsługi witryny? jeśli tak, najlepiej jest stworzyć skrypt obsługujący "dostarczanie" treści. Zapisz zawartość w chronionym katalogu, tj. Nad swoim folderem http lub www. Wtedy, gdy użytkownik jest zalogowany, link do treści będzie wyglądać następująco:

http://yoursite.com/listen.php?song_id=xxx

skrypt zlokalizować żądany utwór id, a następnie przedstawić dane użytkownikowi

7

The jedyną rzeczą, którą możesz w tym celu zrobić za pomocą .htaccess, jest żądanie odsyłającego, które pochodzi z Twojej strony i NIE jest bezpieczne. nie jest banalne wykuwanie odnośnika i nikt nie może wyssać twojej witryny.

Sposób, w jaki będziesz mógł mieć tylko zalogowanych użytkowników, pobierz plik, umieszczając plik poza katalogiem WWW i mając dostęp do skryptu PHP. W skrócie:

if (is_logged_in()) { 
    readfile($name_of_file); 
} else { 
    die("Access denied"); 
} 
+6

Nie powiedziałbym, że to "jedyna rzecz". – Nick

Powiązane problemy