2011-08-19 9 views
32

Tôi có một trang web nơi người dùng có thể đăng nhập và nghe một bài hát (một mp3 tự tạo). Tôi muốn làm cho nó để người dùng đăng nhập có thể nghe/tải xuống/bất cứ điều gì và tệp phải nằm trên máy chủ (không được lưu trữ trong cơ sở dữ liệu MySQL), nhưng không thể truy cập được bởi người dùng không có đường dẫn vào URL.PHP: Làm cách nào để chặn truy cập URL trực tiếp vào một tệp nhưng vẫn cho phép tệp tải xuống bằng cách đăng nhập người dùng?

Ví dụ: nói mp3 của tôi nằm ở mysite.com/members/song.mp3 Nếu bạn đã đăng nhập, bạn sẽ có thể xem trang mysite.com/members/index.php, trang này sẽ cho phép truy cập vào tệp song.mp3. Nếu bạn chưa đăng nhập, trang mysite.com/members/index.php sẽ không hiển thị cho bạn tệp song.mp3 và liên kết trực tiếp với nó sẽ không cấp quyền truy cập.

Tôi khá chắc chắn điều này được thực hiện qua htaccess và tôi đã thực hiện rất nhiều Googling rồi và đã tìm kiếm tại đây. Hai câu trả lời gần nhất tôi tìm thấy là hướng dẫn htaccess http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/ và câu hỏi StackOverflow này Block direct access to a file over http but allow php script access nhưng không trả lời tất cả các câu hỏi của tôi để đáp ứng các tiêu chí của tôi. Tôi đang thiếu gì?

Trả lời

53

Into thư mục thành viên tạo thư mục mới file, di chuyển ở đây tất cả bài hát của bạn, tạo mới tập tin .htaccess và thêm những dòng sau:

Order Deny,Allow 
Deny from all 


Vào thư mục thành viên tạo tệp get_song.php và thêm mã sau đây:

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."); 


Và bây giờ, bạn có thể sử dụng URL này để có được những bài hát file:
http://mysite.com/members/get_song.php?name=my-song-name

+0

Điều này có hiệu quả, cảm ơn bạn rất nhiều! – Bing

+2

Thay vì từ chối truy cập trực tiếp, bạn có thể lưu trữ tệp bên ngoài wwwroot. –

+0

Điều này làm việc cho tôi để :) cảm ơn ... –

3

Bạn có đang sử dụng ngôn ngữ kịch bản như PHP để xử lý trang web của mình không? nếu vậy thì cách tốt nhất là tạo tập lệnh xử lý "phân phối" nội dung. Lưu nội dung vào một thư mục được bảo vệ, ví dụ: phía trên thư mục http hoặc www của bạn. Sau đó, khi người dùng đăng nhập, liên kết nội dung của bạn sẽ trông như thế này:

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

kịch bản sẽ xác định vị trí các bài hát theo yêu cầu của id và sau đó trình bày dữ liệu cho người dùng

7

Các điều duy nhất bạn có thể làm cho điều này thông qua .htaccess là yêu cầu một referer đến từ trang web của bạn, và nó KHÔNG an toàn. nó là ngoài tầm thường để giả mạo một referer và bất cứ ai có thể hút trang web của bạn khô.

Chỉ CHỈ cách bạn sẽ chỉ có thể có người dùng đã đăng nhập tải xuống tệp bằng cách đặt tệp OUTSIDE của webroot của bạn và có quyền truy cập trung gian tập lệnh PHP. Nói tóm lại:

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

sẽ không nói "điều duy nhất" – Nick