php - 使用 Apache 的 Flowplayer 安全流式传输

标签 php apache .htaccess streaming flowplayer

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

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

原帖:
我的客户希望隐藏他的视频,以便在他的域上购买之前无法流式传输(他也不希望用户能够下载视频)。我正在尝试使用 Flowplayer 的安全流媒体来做到这一点,我想我快到了 9 我现在就到了!)。到处搜索后,我找到了 this post .

我已经通过 .htaccess 限制了其他网站的热链接,现在我正在尝试限制仅复制 url 并将其粘贴到地址栏(即 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) 确保一切都已检查(我在此示例中故意省略了长度安全检查)和 3) 将您的视频流提供给 Flowplayer。确保 $originaltimestamp$hash在授予访问权限之前是好的。您还可以检查 session 凭据,从数据库中获取“真实”文件位置,或者在授予用户访问权限之前进行任何类型的 php 安全检查。

还记得更改 Content-type:字段,以便它与正确的文件扩展名相关联(即 video/mp4 如果视频是 *.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 之后(或之下)的文件位置。希望这对像我这样的人有帮助!

有人发现这样做有安全问题吗?

最佳答案

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

$streamname = "http://www.mydomain.com/videos/".$streamname;(已经不在上面了)

我错了。我所要做的就是删除这一行并且它起作用了。它将以您的 baseUrl 开头。所以它已经在“视频”文件夹中,所以 $streamname 应该等于文件在 baseUrl 之后的位置。

顺便说一句,我花了大约一周的时间才解决这个问题,我在互联网上到处寻找,将各个部分拼凑在一起。我将其创建到一个教程中,这样其他人就不会这么头疼了(希望如此!)

关于php - 使用 Apache 的 Flowplayer 安全流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9860868/

相关文章:

apache - access_log 很大,没有被归档。如何重置?

node.js - 使用 htaccess 重定向到 nodejs 应用程序

php - 如何根据查询字符串中的匹配使用 SetEnvIf?

javascript - 仅在选中复选框时显示数据

javascript - Ajax 使用 GET 转 PHP

apache - 使用 ,htaccess 将非 www 重定向到 www

php - 通过 htaccess 文件强制 http 到 https,不起作用

php - 具有多个自定义字段的 wp_query 返回 0 个结果

php - fetch_array 与准备好的声明? PHP MySQL?

python - Django 和限制 RAM 使用 : Recommended syntax, 约定和策略?