如何使用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);