0

如何保护数字产品(视频、音频、电子书等)免遭未经授权的下载?我正在使用 Apache 服务器和 PHP/MySQL。请帮忙!

谢谢!保罗·G。

编辑:对不起,不完整的问题。我想要的是避免其他成员共享指向他们有权访问非成员的文件的直接下载链接。我听说可以通过将数字产品存储在根文件夹之外来完成,但我不知道如何用 PHP 准确地实现它。

4

1 回答 1

2

我将假设您正在尝试保护仅对“登录”用户可用的文件......如果您只是试图阻止人们下载嵌入在您网站中的文件,那么确实你无能为力。

因此,在您尝试仅允许经批准的用户访问/下载文件的前提下进行操作,您最好的选择是仅通过php控制器文件(我们称之为serve_file.php)提供受保护的内容。您将实际文件存储在公共根目录(或其他一些不可访问的文件夹)之外,或者将文件作为BLOB数据存储在MySQL表中。

然后,当用户想要下载文件时,将提供一个链接,serve_file.php其中包含一些_GET标识他们试图获取的文件的数据:

http://mysite.com/serve_file.php?file_id=24, 例如。

serve_file.php脚本获取_GET数据,确定它所指示的文件,然后检查权限表(或仅检查用户是否已登录)并确定用户是否有资格接收该文件。如果是,它会获取文件数据(来自 MySQL 或 with file_get_content()),吐出适当headers的(取决于您提供的文件类型),然后print/ echos 内容:

//check that the user is logged in (I'm assuming you have a function of this name)
if (!user_logged_in()){
   die('You do not have permission! Please log in');
}

/*see what file the user is trying to get... 
this is a very simple sample that can only get PDFs.
You should probably have a table with file details*/
$file_location = $_SERVER['DOCUMENT_ROOT'].'/../protected_files/file_'.intval($_GET['file_id']).'.pdf'
if (!is_file($file_location)){
   die('Could not get that file!');
}

$content = file_get_contents($file_location);
header("Content-Type: application/pdf");
header("Content-Length: ".strlen($content));
//add some more headers here, to deal with caching, etc
echo $content;
die();

header您设置的s 告诉用户的浏览器它应该如何解释您发送的数据(例如,作为Content-Type: application/pdf)并且您已经成功地只允许授权用户访问文档,因为他们总是必须通过您的 PHP 身份验证脚本。

于 2013-05-09T22:21:24.107 回答