7

使用 php/.htaccess 密码保护快速流媒体视频的最佳方法是什么。它们使用 rtsp 进行流式传输,但如有必要,我可以使用其他格式。

我知道如何使用 php 进行身份验证,但我不确定如何设置身份验证,以便保护流文件 url,以便用户不能只是复制 url 并共享它。

还是我想太多了,我可以使用普通的身份验证方案并将文件放在受保护的目录中?

4

4 回答 4

6

nginx 和 lighttpd 网络服务器都有 X-Send-File 标头,您可以从 PHP 返回。因此,您可以在 PHP 中进行检查,然后有条件地输出文件。

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

Lighttpd 还有一个名为mod_secure_download的简洁模块,它允许您以编程方式生成一个仅在短时间内有效的 URL。

Nginx 和可能的 lighttpd 允许您限制下载速度,因此您发送流数据的速度不会超过可以消耗的速度。

无论哪种方式,您都希望使用 Web 服务器来提供文件。通过 PHP 为它们提供服务是可能的,但速度很慢。

于 2008-11-13T13:20:51.020 回答
1

尝试使用 Amazon S3 服务,它有一些怪癖,但一旦你熟悉它就有意义了。

他们的 API 中有钩子来实现在指定时间内处于活动状态的临时 URL,因此您可以自由地向访问者显示 url,因为它在 10 分钟左右后将无法工作。

使用 php(大约 15 行代码)几乎是微不足道的事情,他们的论坛上有很多示例,因此您无需从头开始阅读有关如何实现此目的的完整文档。

在生成和显示链接之前你会做什么样的授权取决于你。

您还可以让它看起来像是从您的域(例如 video.yourdomain.com)而不是标准 s3 URL 提供的。

最后一件事,它很便宜——当我上传 8 GB 并完全下载 3 次并初始化下载约 100 次时,我们为测试和部署一个月支付了大约 2 美元。我为之做这件事的人对价格非常满意,以至于他想将所有可下载的媒体移动到 s3。

现在,重新阅读我写的所有内容,它看起来像商业/垃圾邮件,但我对服务非常满意,因为我之前为音频文件编写了所有内容,并且花了几天时间才一切正常,这需要几个小时才能实现(主要是熟悉服务)。

于 2008-11-13T07:40:01.133 回答
1

您可能想看看: mod_xsendfile (for apache)

它使您能够在内部重定向到文件。

因此,您可以将下载链接指向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');
}
?>

该模块也可用于其他网络服务器。如果我没记错的话,这个想法最初来自 lighttpd,但是 - 正如 Josh 所说 - 也可用于 nginx。

于 2008-11-13T13:33:35.157 回答
0

首先,欺骗引用者非常容易。此信息存储在用户的浏览器中,因此用户可以简单地远程登录到您的服务器并提供与您的域匹配的自己的引荐来源。

您可以尝试几件事:

首先,更安全,但仍然可以欺骗。mod_rewrite 提供了检查 cookie 的能力。您可以做的是在用户访问您的包含一些模糊数据的网站时设置一个 cookie。然后,您可以将您的 RerwriteCond 修改为如下内容:

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]

另一种更好的技术将涉及使用 PHP 和 mime 类型。我不确定这会在多大程度上支持流媒体内容,但我认为它会起作用。您可以做的是让所有视频链接指向一个 .php 文件(查询字符串将确定选择了哪个视频)。然后,当用户尝试访问此链接时,您可以执行以下操作:

<?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);
    }
?>

根据我的阅读,大多数服务器都知道哪些 mime 类型是流式 mime 类型,因此浏览器应该能够弄清楚如何正确处理流式文件。

于 2008-11-13T05:11:44.723 回答