2008-11-13 54 views
6

Cách tốt nhất để mật khẩu bảo vệ video phát trực tuyến nhanh bằng php/.htaccess là gì. Chúng đang được truyền trực tuyến bằng rtsp, nhưng tôi có thể sử dụng các định dạng khác nếu cần.Cách mật khẩu bảo vệ video trực tuyến bằng php

Tôi biết cách xác thực bằng php, nhưng tôi không chắc chắn cách thiết lập xác thực để bảo vệ các url của tệp trực tuyến để người dùng không thể sao chép url và chia sẻ url.

Hoặc tôi có thể sử dụng quá trình xác thực thông thường và đặt các tệp trong thư mục được bảo vệ không?

Trả lời

0

Trước hết, rất dễ giả mạo người giới thiệu. Thông tin này được lưu trữ trong trình duyệt của người dùng, vì vậy người dùng có thể chỉ cần telnet vào máy chủ của bạn và cung cấp tham chiếu của riêng mình khớp với miền của bạn.

Một vài điều bạn có thể thử:

Đầu tiên, bảo mật hơn, nhưng vẫn giả mạo. mod_rewrite cung cấp khả năng kiểm tra cookie. Những gì bạn có thể làm là đặt cookie khi người dùng truy cập vào trang web của bạn có chứa một số dữ liệu không rõ ràng. Sau đó, bạn có thể sửa đổi RerwriteCond thành một cái gì đó như thế này:

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_COOKIE} obscurename=obscurevalue [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] 
RewriteRule \.(asx¦ASX)$ http://www.yourdomain.com/images/leech.gif [R,L] 

Một kỹ thuật khác tốt hơn sẽ liên quan đến làm việc với PHP và loại mime. Tôi không chắc chắn mức độ này sẽ hỗ trợ nội dung trực tuyến, nhưng tôi cho rằng nó sẽ hoạt động. Những gì bạn có thể làm là có tất cả các liên kết video trỏ tới tệp .php (chuỗi truy vấn sẽ xác định video nào đã được chọn). Sau đó, khi người dùng cố gắng đến thăm liên kết này, bạn làm điều gì đó giống như vậy:

<?php 
    // You could also check some sort of session variable 
    // that is set when the user visits another part of your 
    // site 
    if(!isLoggedIn()){ 
     header("Location: errorPage.htm"); 
     exit; 
    }else{ 
     // Get the name of the file specified 
     $file = get_file_name($_GET['fileID']); 

     // Specify the proper mime-type for the data you're sending 
     // (this may have to change, depending on your situation) 
     header("Content-type: video/vnd.rn-realvideo"); 

     // Read the file and output it to the browser 
     readfile($file); 
    } 
?> 

Từ những gì tôi đọc, hầu hết các máy chủ biết được mime-loại là streaming mime-loại, do đó trình duyệt sẽ có thể hình cách xử lý tệp truyền trực tuyến đúng cách.

+1

Giải pháp thứ hai sẽ hoạt động và an toàn. Tuy nhiên nó không phải là một ý tưởng rất tốt để vượt qua các tập tin lớn (video) trough php. – Jacco

1

Hãy thử sử dụng dịch vụ Amazon S3, nó có những điều kỳ quặc nhưng nó có ý nghĩa khi bạn làm quen với nó.

Có các móc trong API của chúng để đạt được thời gian của URL đang hoạt động trong một khoảng thời gian cụ thể, vì vậy bạn có thể tự do hiển thị url cho khách truy cập vì nó sẽ không hoạt động sau 10 phút.

Điều gần như tầm thường để làm với php (khoảng 15 dòng mã), có rất nhiều ví dụ trên diễn đàn của họ để bạn không cần phải đi từ đầu và đọc tài liệu đầy đủ về cách đạt được điều này.

Loại ủy quyền nào bạn sẽ làm trước khi tạo và hiển thị liên kết tùy thuộc vào bạn.

Bạn cũng có thể có vẻ như nó được phân phát từ miền của bạn như video.yourdomain.com thay vì URL s3 chuẩn.

Điều cuối cùng, giá rẻ - chúng tôi trả khoảng 2 đô la Mỹ cho tháng thử nghiệm và triển khai khi tôi tải lên 8 GB và tải xuống 3 lần hoàn toàn và tải xuống ban đầu khoảng 100 lần. Người mà tôi đã làm điều này đã rất hài lòng với mức giá mà anh ấy muốn chuyển tất cả các phương tiện truyền thông có thể tải xuống của anh ấy sang s3.

Bây giờ, đọc lại mọi thứ tôi viết có vẻ như thương mại/spam nhưng tôi rất hài lòng với dịch vụ vì tôi đã mã hóa mọi thứ cho tệp âm thanh trước đó và phải mất nhiều ngày cho đến khi mọi thứ hoạt động tốt và mất vài giờ để thực hiện (chủ yếu là làm quen với dịch vụ).

3

Cả máy chủ web nginx và lighttpd đều có tiêu đề X-Send-File, bạn có thể trả về từ PHP.Vì vậy, bạn có thể làm kiểm tra của bạn trong PHP và sau đó có điều kiện máy chủ ra các tập tin.

if (check_user_can_access()){ 
    header('X-sendfile: /path/to/file'); 
} else { 
    header('HTTP/1.1 403 Fail!'); 
} 

Lighttpd cũng có một module gọn gàng gọi mod_secure_download cho phép bạn programatically tạo ra một URL đó sẽ chỉ có giá trị trong một khoảng thời gian ngắn.

Nginx và có thể là lighttpd, cho phép bạn giới hạn tốc độ tải xuống, vì vậy bạn không thể gửi dữ liệu phát nhanh hơn mức có thể sử dụng.

Dù bằng cách nào, bạn cũng muốn sử dụng máy chủ web để phân phát tệp. Phục vụ chúng thông qua PHP là có thể, nhưng chậm.

+1

Đề xuất tốt nhất tại đây. Tôi quá thứ hai mà bạn sử dụng một mô-đun cho httpd của bạn. Dễ dàng hơn nhiều so với mã hóa một trừu tượng thổi đầy đủ trong ứng dụng của bạn. – Till

+0

Tôi gặp sự cố khi thực hiện thao tác tìm kiếm. Bất kỳ đầu mối về cách tôi có thể thực hiện một tìm kiếm bằng cách sử dụng phương pháp này? – sj7

1

Bạn có thể muốn có một cái nhìn tại địa chỉ: mod_xsendfile (for apache)

Nó cho phép bạn chuyển hướng đến trong nội bộ một tập tin.

Vì vậy, bạn có thể chỉ link download của mình để checkCredentials.php

<?php 
if (isAuthorised($_POST['user'], $_POST['pass'])) { 
    header("X-Sendfile: $somefile"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; file=\"$somefile\""); 
    exit(0); 
} else { 
    show403('bad credentials'); 
} 
?> 

Module này cũng có sẵn cho máy chủ web khác. Nếu tôi nhớ chính xác, ý tưởng ban đầu xuất phát từ lighttpd, nhưng - như Josh states- cũng có sẵn cho nginx.

1

Trong giải pháp của Jacco, bạn có thể kiểm tra các tiêu đề và tìm url cho tệp và tải xuống mà không cần xác thực không?

Một giải pháp có thể tôi có thể nghĩ là đặt các tệp ở nơi không thể truy cập được vào bất kỳ ai trừ trình duyệt, tức là sử dụng .htaccess từ chối tất cả. Liệu điều đó có hiệu quả?

+1

Không, không phải. Tiêu đề X-Sendfile bị xóa, tệp xuất hiện ở vị trí được yêu cầu. Hơn nữa, x-sendfile có thể đọc các tập tin thường không thể truy cập được trên web – Jacco

Các vấn đề liên quan