Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP令牌或会话保护mp4文件_Php - Fatal编程技术网

如何使用PHP令牌或会话保护mp4文件

如何使用PHP令牌或会话保护mp4文件,php,Php,我有一个名为.dir的目录和名为.vids的子目录,我想使用php令牌或会话保护我的所有.mp4文件不被直接访问,因此没有人可以嵌入或超链接我的视频,只有我网站的用户可以播放或下载我的文件 这是我迄今为止使用.htaccess尝试的方法。此文件位于.dir目录中 RewriteEngine on RewriteCond %{HTTP_REFERER} !^https://my domain .com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^https://w

我有一个名为
.dir
的目录和名为
.vids
的子目录,我想使用php令牌或会话保护我的所有.mp4文件不被直接访问,因此没有人可以嵌入或超链接我的视频,只有我网站的用户可以播放或下载我的文件

这是我迄今为止使用
.htaccess
尝试的方法。此文件位于
.dir
目录中

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://my domain .com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.my domain .com/.*$ [NC]
RewriteRule .(mp4|mp3|avi)$ - [F]
当有人试图访问
mydomain.com/.dir/.vids/myfile.mp4
时,它显示403禁止,但我仍然不知道人们如何访问我的文件,这会导致我的服务器过载和带宽不足,因此我想使用php令牌或会话保护我的所有文件,这样就没有人能够直接访问我的文件和目录路径

我发现了以下php代码来保护流

<?php

$flussonic = 'http://flussonic-ip'; // flussonic address
$key = 'SECRETKEY'; // key from flussonic.conf file. KEEP IT IN SECRET
$lifetime = 3600 * 3; // 3 hours after link will be invalid

$stream = $_GET['stream']; // this script get streamname from a query string (script.php?stream=bbc)

$ipaddr = $_SERVER['REMOTE_ADDR'];
$desync = 300; // allowed time desync between flussonic and hosting servers in seconds
$starttime = time() - $desync;
$endtime = $starttime + $lifetime;
$salt = bin2hex(openssl_random_pseudo_bytes(16));

$hashsrt = $stream.$ipaddr.$starttime.$endtime.$key.$salt;
$hash = sha1($hashsrt);

$token = $hash.'-'.$salt.'-'.$endtime.'-'.$starttime;
$link = $flussonic.'/'.$stream.'/embed.html?token='.$token.'&remote='.$ipaddr;
$embed = '<iframe allowfullscreen style="width:640px; height:480px;" src="'.$link.'"></iframe>';

echo $embed;
?>

上述代码取自
https://flussonic.com/doc/authorization/securing-access-to-streams-authorization-with-token

我尝试了很多方法,但都不能满足我的需要

任何建议和帮助都将不胜感激。

第一件事第一。。。 如果您在HTTP服务器上拥有控制权,并且正在使用apache,我建议您通过.htaccess中的mod_重定向来控制它

RedirectMatch 403 ^/uploads/?$
将此添加到您的.htaccess

RedirectMatch 403 ^/uploads/?$
当然,更改/上传/到您的mp3/mp4目录

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://my domain .com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.my domain .com/.*$ [NC]
RewriteRule .(mp4|mp3|avi)$ - [F]
第二,你的方法很好,不过我会在链接中添加更多的熵

无论如何,千万不要在你的$link或任何请求中透露文件的位置。创建一个最终看起来像

然后根据您的文件验证哈希,并使用readfile将mp4流式传输到浏览器。

第一件事。。。 如果您在HTTP服务器上拥有控制权,并且正在使用apache,我建议您通过.htaccess中的mod_重定向来控制它

RedirectMatch 403 ^/uploads/?$
将此添加到您的.htaccess

RedirectMatch 403 ^/uploads/?$
当然,更改/上传/到您的mp3/mp4目录

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://my domain .com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.my domain .com/.*$ [NC]
RewriteRule .(mp4|mp3|avi)$ - [F]
第二,你的方法很好,不过我会在链接中添加更多的熵

无论如何,千万不要在你的$link或任何请求中透露文件的位置。创建一个最终看起来像


然后根据您的文件验证哈希,并使用readfile将mp4流式传输到浏览器。

引用者标头由用户提供,可以设置为用户希望的任何格式,例如:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://yoursite.com/video.mp4");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Referer: http://yoursite.com/']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec ($ch);
curl_close ($ch);
这就是为什么任何人都可以随心所欲地抓取你的视频

如果要限制使用PHP下载文件,则需要强制执行只能通过PHP脚本下载文件

首先,将视频文件移到文档根目录之外,这样web服务器就不会直接为它们提供服务。如果你想半途而废,你可以用配置指令来完成,但是如果你不小心破坏了配置,你又回到了无所事事的状态

例如:

其次,制作一个脚本,检查访问权限并实际为文件提供服务,例如:

// http://yoursite.com/foo.php?video=foo.mp4&token=1234abcd

$video = $_GET['video'];
$token = $_GET['token'];

if( ! valid_token($token) ) {
  http_response_code(401);
  exit();
}
if( ! valid_and_safe_video_name($video) ) {
  http_response_code(400);
  exit();
}

$video_path = '../videos/' . $video;

header('Content-Type: video/whatever');
readfile($video_path);
或者,如果您的服务器支持
X-Sendfile
,您可以使用它使Apache处理读取文件的操作,而不是占用PHP进程

// replaces readfile()
header('X-Sendfile: ' . $video_file);

referer标头由用户提供,可以设置为用户想要的任何内容,例如:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://yoursite.com/video.mp4");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Referer: http://yoursite.com/']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec ($ch);
curl_close ($ch);
这就是为什么任何人都可以随心所欲地抓取你的视频

如果要限制使用PHP下载文件,则需要强制执行只能通过PHP脚本下载文件

首先,将视频文件移到文档根目录之外,这样web服务器就不会直接为它们提供服务。如果你想半途而废,你可以用配置指令来完成,但是如果你不小心破坏了配置,你又回到了无所事事的状态

例如:

其次,制作一个脚本,检查访问权限并实际为文件提供服务,例如:

// http://yoursite.com/foo.php?video=foo.mp4&token=1234abcd

$video = $_GET['video'];
$token = $_GET['token'];

if( ! valid_token($token) ) {
  http_response_code(401);
  exit();
}
if( ! valid_and_safe_video_name($video) ) {
  http_response_code(400);
  exit();
}

$video_path = '../videos/' . $video;

header('Content-Type: video/whatever');
readfile($video_path);
或者,如果您的服务器支持
X-Sendfile
,您可以使用它使Apache处理读取文件的操作,而不是占用PHP进程

// replaces readfile()
header('X-Sendfile: ' . $video_file);