使用php / .htaccess密码保护快速流媒体视频的最佳方式是什么?它们使用rtsp进行流式传输,但如果需要,我可以使用其他格式。
我知道如何使用php进行身份验证,但我不确定如何设置身份验证以保护流式文件网址,以便用户不仅可以复制网址并进行共享。
或者我是否过度思考这个并且我可以使用普通的身份验证方案并将文件放在受保护的目录中?
答案 0 :(得分:4)
nginx和lighttpd Web服务器都有可以从PHP返回的X-Send-File标头。因此,您可以在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 :(得分:1)
尝试使用Amazon S3服务,它有它的怪癖但是一旦你熟悉它就有意义了。
他们的API中有钩子来实现在指定时间内处于活动状态的临时URL,因此您可以自由地向访问者显示URL,因为它将在10分钟左右后无法工作。
使用php(大约15行代码)几乎是微不足道的事情,他们的论坛上有很多例子,所以你不需要从头开始阅读有关如何实现这一目标的完整文档。
在生成和显示链接之前,您将做什么样的授权。
您也可以将其视为来自您的域名,例如video.yourdomain.com,而不是标准的s3网址。
最后,它很便宜 - 当我上传8 GB并完全下载3次并初始化下载约100次时,我们在测试和部署月份支付了大约2美元。我这样做的人对价格非常满意,以至于他想把所有可下载的媒体都移到s3。
现在,重新阅读我写的所有内容看起来像商业/垃圾邮件,但我对服务非常满意,因为我之前为音频文件编写了所有内容,并且需要几天才能完成所有工作,并且需要花费几个小时来实施(主要是熟悉服务)。
答案 2 :(得分: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。
答案 3 :(得分: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类型,因此浏览器应该能够弄清楚如何正确处理流式文件。