如何使用php为流媒体视频设置密码保护

7

如何使用php/.htaccess密码保护quicktime流视频是最佳方式?它们使用rtsp进行流式传输,但如果需要,我可以使用其他格式。

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

或者,我是否过于考虑了,我可以使用普通的身份验证方案并将文件放置在受保护的目录中?

4个回答

6

nginx和lighttpd web服务器都有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提供它们是可能的,但速度慢。


1
这里最好的建议是使用一个模块来处理你的httpd,我也赞同这种做法。相较于在你的应用程序中编写完整的抽象层,使用模块要更容易一些。 - Till
我在执行搜索操作时遇到了问题。您有什么线索可以告诉我如何使用这种方法实现搜索吗? - sj7

1

尝试使用Amazon S3服务,它有一些怪癖,但一旦熟悉了就很容易理解。

他们的API中有钩子可以实现指定时间内有效的临时URL,因此您可以自由地向访问者显示URL,因为10分钟后或更长时间它将无法工作。

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

在生成和显示链接之前,您将进行什么样的授权取决于您。

您还可以使其看起来像是从您的域名提供服务,例如video.yourdomain.com,而不是标准的s3 URL。

最后,它很便宜-当我上传了8 GB并完全下载了3次并初始化了大约100次下载时,我们支付了约2美元的测试和部署费用。我为此做事的人对价格非常满意,他想将所有可下载媒体都转移到s3。

现在,重新阅读我写的一切,它看起来像商业广告/垃圾邮件,但是我对这项服务感到非常满意,因为我之前编写了所有音频文件的代码,直到一切都正常工作花了数天,而这只需要几个小时来实施(主要是熟悉服务)。


1
您可能想看一下: mod_xsendfile(适用于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');
}
?>

这个模块也适用于其他的Web服务器。如果我没记错的话,这个想法最初来自lighttpd,但正如Josh所说,它也适用于nginx。


0
首先,伪造 referer 是非常容易的。这个信息存储在用户的浏览器中,所以用户可以通过 telnet 连接到你的服务器并提供他自己的 referer,以匹配你的域名。
你可以尝试几件事情:
首先,更安全,但仍然容易伪造。mod_rewrite 提供了检查 cookie 的功能。你可以在用户访问你的网站时设置一个包含一些模糊数据的 cookie。然后,你可以修改 RewriteCond 为类似以下内容:
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类型,因此浏览器应该能够正确地处理流媒体文件。

1
第二种解决方案可行且安全。但是,通过 PHP 传递大文件(视频)并不是一个很好的主意。 - Jacco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接