我想使用一些系统来创建用于下载和流式传输的受保护/唯一网址。例如,我们有:
domain/file.mp4
对于能够下载该文件的用户,我想将其放在带有下载按钮和流媒体播放器的php页面中,这样就可以了:
域/下载?= file.mp4
在生成的php页面中,下载URL为:
domain/file.mp4? AccessKeyId=AXIXI
因此,用户将无法共享链接。 我甚至不知道这是否可行,只是在这里询问一些想法。
答案 0 :(得分:0)
使用cookie验证下载链接。如果两者匹配,则允许下载。
例如,包含下载链接的PHP文件可以按如下方式生成它:
<?php
///// Put these two lines in a shared config file: /////
define('SALT','*** Insert a random string here ***');
define('RESOURCES_DIRECTORY', '/home/eazy/files/');
////////////////////////////////////////////////////////
function get_download_url($filename) {
$expire = time() + 3600; // Link expires in 1 hour
$auth_data = "f=$filename&e=$expire";
$cookie_key = md5($auth_data . SALT);
setcookie('key',$cookie_key,0,'/');
return "/download.php?$auth_data";
}
?>
<a href="<?= get_download_url('my_video.mp4') ?>" rel="nofollow">Download video</a>
然后/download.php
文件可以按如下方式验证下载:
<?php
$filename = @$_GET['f'];
$expire = intval(@$_GET['e']);
$auth_data = "f=$filename&e=$expire";
$cookie_key = md5($auth_data . SALT);
$file = RESOURCES_DIRECTORY . $filename;
if (@$_COOKIE['key'] != $cookie_key || $expire < time() || !file_exists($file)) {
header('HTTP/1.1 404 Not Found');
die("File not found");
}
else {
header('Content-Type: video/mp4');
header('Content-Length: ' . filesize($file));
readfile($file);
}
如果可以避免生成open_basedir restriction错误,请将可下载文件存储在WWW目录之外。这样,用户将别无选择,只能使用此脚本访问文件,只有通过访问包含下载链接的页面获得有效cookie才能成功。
注意:此代码会破坏随意链接共享,但不是超级安全,也不会阻止人们共享下载的文件。没有必要过于偏执,因为即使他们无法轻松共享下载链接,人们仍然可以共享下载的文件。