使用Apache的Flowplayer安全流媒体

时间:2012-03-25 14:20:23

标签: php apache .htaccess streaming flowplayer

更新:现在这是一个教程,介绍如何在以下情况下为流媒体视频提供某种程度的安全性:
1)您正在使用带有Apache的Flowplayer 2)您不希望用户能够下载视频(仅限流媒体)
3)您不希望用户能够将视频的URL放在浏览器中(限制访问视频)
4)您只希望用户能够在视频具有正确的凭据时流式传输视频

您必须事先了解 PHP .htaccess 文件。

原帖:
我的客户希望隐藏他的视频,以便在他们的域名上购买之前不能进行流式传输(他不希望用户能够下载视频)。我正在尝试使用Flowplayer的Secure Streaming,我想我差不多9我现在在那里!)。在搜索到处后,我找到了this post

我通过.htaccess限制了其他网站的热链接现在我试图限制只是复制网址并将其粘贴到地址栏中的人访问(即http://www.mydomain.com/videos/testVideo.mov

我已经使用PHP / AJAX生成这个HTML(大多数示例都使用JS Flowplayer插件,我使用<object>标签来嵌入播放器,不涉及JS。如果你使用JS插件,使用它而不是嵌入式版本,.htaccess文件和video.php文件将是相同的。)

$videofilename = 'testVideo.mov';    
$hash = md5('1234');
$timestamp = time();
$videoPath = $hash.'/'.$timestamp.'/'.$videofilename;
echo '
<object width="667" height="375" type="application/x-shockwave-flash" data="http://releases.flowplayer.org/swf/flowplayer-3.2.8.swf">
    <param name="wmode" value="transparent"/>
    <param name="movie" value="../swf/flowplayer.securestreaming-3.2.8.swf" />
    <param name="allowfullscreen" value="true" />
    <param name="timestamp" value="'.$timestamp.'" />
    <param name="token" value="'.$hash.'" />    
    <param name="streamName" value="'.$videofilename.'" />      

    <param name="flashvars" value=\'config={
        "playlist":[
            {"url": "'.$videoPath.'", "baseUrl": "http://www.mydomain.com/videos", "autoPlay":false,"autoBuffering":true,"bufferLength":5}
            ]

        }\' />
</object>';

现在在videos目录中我放了​​这个.htaccess文件:

 RewriteEngine on
 RewriteRule ^(.*)/(.*)/(.*)$ http://www.mydomain.com/vidoeos/video.php?h=$1&t=$2&v=$3
 RewriteRule ^$ - [F]
 RewriteRule ^[^/]+\.(mov|mp4)$ - [F]

更新 php文件的目的是 1)获取数据哈希,时间戳和视频文件名(test.mov或其他) 2)确保所有内容都检出(I故意在本例中省略了安全检查的长度和 3)为Flowplayer提供视频流。在提供访问权限之前,请确保$originaltimestamp$hash是好的。您还可以检查会话凭据,从数据库中获取“真实”文件位置,或者在授予用户访问权限之前执行任何类型的php安全检查。

另请注意更改Content-type:字段,使其与正确的文件扩展名相关联(如果视频为* .mp4,则为video/mp4

videos/video.php看起来像这样:

<?php
session_start();

$hash = $_GET['h'];
$streamname = $_GET['v'];
$originaltimestamp = $_GET['t'];

header('Content-Description: File Transfer');
header('Content-type: video/quicktime');
header("Content-length: " . filesize($streamname));
header("Expires: 0");
header("Content-Transfer-Encoding: binary");

$file = fopen($streamname, 'r');
echo stream_get_contents($file);    
fclose($file);
?>

总共有三个文件, HTML 与播放器, .htaccess 文件,最后是 video.php 文件。我原来的问题是$streamname错了。请记住,$streamname应该是BaseUrl之后(或之下)的文件位置。希望这有助于像我这样的人!

任何人都可以通过这种方式看到安全问题吗?

2 个答案:

答案 0 :(得分:3)

好的,我解决了!在这一行:

$streamname = "http://www.mydomain.com/videos/".$streamname;(它不再存在了)

我错了。我所要做的就是删除这一行并且它有效。它将从您的baseUrl开始。所以它已经在'videos'文件夹中,所以$ streamname应该只等于baseUrl之后的文件位置。

另一方面,这花了我一个星期的时间来解决我在互联网上随处可见的问题。我把它创建成一个教程,所以其他人不会有这么头疼(希望!)

答案 1 :(得分:2)

我花了两天时间才发现这个......

如果您的视频存储的目录是CHMOD到777,那么它将停止流...

我绕着房子试图弄清楚为什么在地狱的名字中这不会流式传输我的视频......

我有一个已经建立的视频文件目录,正如另一个流行的图片php脚本所使用的那样,该脚本在该时间内将该目录设置为CHMOD 777 ...只需将其设置为CHMOD 755即可让flv或mp4流式传输到我的播放器嵌入到我的php页面......我很放心!

非常感谢头痛的缓解......这确实有很大的帮助,欢呼声