2012-02-05 56 views
1

我用PHP和MYSQL制作了一个数据库系统。它有很多敏感信息,所以我试图把最好的安全性。试图保护多媒体文件

我对视频和音频文件有疑问。我只想要登录并且实际上有权下载文件以便能够下载它们的用户,而不是任何只指向媒体文件所在的文件夹的用户。我怎样才能做到这一点?!谢谢!

+0

你存储数据库或文件系统上的文件? – Vyktor 2012-02-05 18:43:45

回答

0

通过一个php包装器(即<img src="files/file.php?id=oj348jfoj" />)调用你的文件,并在你的file.php文件中输出带有图像头的文件,如果用户有权查看文件的话。在你的表中,你有与你的oj348jfoj标记对应的真实图像URI,这就是你file.php加载并输出为请求者的图像。通过这种方式,服务器文件的真实URI保持隐藏状态,您可以检查每个图像加载的访问权限。

+0

我会在哪里放置文件?如果他们知道他们在哪个文件夹,他们仍然可以通过url访问? – xionhack 2012-02-05 19:23:11

+0

在一个你通过htaccess限制外部访问的文件夹中 - 此外,这已经需要有人猜测正确的文件夹和文件名,因为你没有公开任何地方 – kontur 2012-02-05 19:45:02

-2

所以。这些文件必须在服务器上,这很明显。这里有一个建议:将它们隐藏在某个地方。然后,当用户点击下载时,复制将其内容复制到临时位置并保存到10到30分钟的MySQL表中(如果HUGE文件可能更多)。然后用户可以从该链接下载。最后,每10-30分钟(等量)运行一次cronjob,删除过期的文件。

这不是100%的安全性,因为一个未登录的用户也可以下载,但只有当登录的用户共享URL时,他们才可以直接发送给他们。

+0

谁downvoted:你能解释原因吗? – axiomer 2012-02-05 18:46:50

+0

这是不安全的,它过于复杂。您可以拥有无​​法直接访问的文件,而不是创建临时公共位置。 – 2012-02-05 19:44:08

+0

可能很复杂,但这是安全的,因为文件名可能是随机的,因此,未登录将要么尝试(这是不可能的),要么已登录的必须共享URL,但它是一样的如果他们共享文件。您的观点对安全无效。 – axiomer 2012-02-05 19:48:14

0

您需要使用PHP流式传输文件。使用查询字符串传递文件的名称,然后将其写入页面。在流式传输文件之前,您可以检查权限。

伪代码:

header("Content-Disposition: atachment; filename=$filename"); 
header("Content-Type: application/octet-stream"); 
header("Content-Length: ".filesize("$path/$filename")); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
$fp=fopen("$path/$filename","r"); 
print fread($fp,filesize("$path/$filename")); 
fclose($fp); 
exit(); 
+0

我会在哪里放置文件?如果他们知道他们在哪个文件夹,他们仍然可以通过url访问? – xionhack 2012-02-05 19:22:57

+0

使用包含“全部拒绝”的.htaccess文件拒绝对它们的访问。这可以防止通过Apache的直接请求,但仍然允许PHP读取(并输出)它们。或者更好的解决方案是将它们放在你的apache文档根目录之上,这样很明显它们不能从Apache访问。 – Mark 2012-02-05 19:39:29

+0

我建议你把它们放在你的文档根目录下,这样它们就不能用任何url访问。 – 2012-02-05 19:41:51