如何去保护文件免受未经授权的下载

问题描述:

我正在创建一个使用PHP和MySQL数据库的会员网站,我有办法让用户使用他们的用户名和密码登录。所有漂亮的标准东西。如何去保护文件免受未经授权的下载

我甚至有系统允许注册用户下载示例视频文件。这也很好。

然而,问题是任何能够找出文件系统的人都可以直接下载这些文件。假设我们的主文件夹包含名为“视频”的视频内容,在“视频”内部,我们有子文件夹,如“飞机”,“火车”和“汽车”,每个文件夹内都有独立的文件夹如'飞机','道具'和'间谍'),以及每个子类别的特定视频。

所以如果有人知道文件系统,他们只需输入https://www.myvideosite.com/videos/planes/jets/f15.wmv并下载到他们心中的内容,只要他们知道文件名即可。 (正如你所看到的,我有一个安全的连接,它在运行Linux的Apache服务器上。)

这是我想在发现之前插入的一个主要安全漏洞。我研究过.htaccess,但是我的努力往往导致整个'视频'文件夹无法访问(我承认,我是所有这些新手!)。

我也读过关于将我的视频文件放在网站根文件夹之外,但看起来更令人困惑。

简而言之,我怎么可以禁止不是会员的人下载,而是可以通过任何方式发现文件系统是什么?在我看来,这应该很简单,但唉,我没有找到一个可靠的答案。

+1

流从PHP - 见http://*.com/questions/1563069/stream-binary-file -from-mysql-to-download-with-php等 – Aerik 2013-02-26 00:10:02

+0

用户只是在下载这些文件,还是需要让他们可以在浏览器中查看? – 2013-02-26 00:26:36

+0

@Mike Brant这些文件是严格下载。尽管现在你提到它,但对话框确实提供了在浏览器中打开的选项。 – mileaminute 2013-02-26 00:29:47

您可以使用.htaccess文件和“路线”通过PHP脚本的所有请求保护您的视频文件夹:

RewriteEngine on 
RewriteRule (.*) index.php?file_id=$1 [L] 

而且在index.php

session_start(); 
// get filename from database or somewhere else 
$filename = getFilename($_GET["file_id"]); 

if ($_SESSION["is_logged_in"]) { 
    readfile($filename); 
} 
+0

您可能需要添加验证以确保某人不会添加类似“../ foo/bar.file”的文件 – Class 2013-02-26 00:14:48

+0

这可以工作+1。使用readfile(),您还可以将您的视频存储在webroot下面,而不必担心.htaccess – 2013-02-26 00:15:20

+0

@Class有趣......您能否详细说明一下? – mileaminute 2013-02-26 00:22:22

做认证这里有一个答案,如果你有问题.htaccess

好的,所以如果你服务这是public_html,去它的父目录创建一个目录名称“视频”。 (如果不在public_html中,则可能需要在路径中添加一些../)。 pathinfo负责验证问题,并且如果有人试图偷偷摸摸地找到一个路径,它将只返回一个文件名。如果您的download.php的名字,这样的:?

的download.php视频= fun.mp4

会加载一个名为从视频目录fun.mp4文件。

<?php 
// do your user authentication 
$video_directory = "../videos/"; 
$file = pathinfo($_GET["video"], PATHINFO_BASENAME); 
if($user_is_logged_in) 
{ 
    if(file_exists($file) readfile($video_directory . $file); 
} 

?> 
+0

谢谢你,我现在就看看。告诉我,这是否会阻止人们直接在浏览器中输入路径和文件名来下载文件? – mileaminute 2013-02-26 03:03:53

使用简单的.htaccess/htpasswd的认证,摘要或基本:

http://www.askapache.com/online-tools/htpasswd-generator/

+0

事实上,我通过My​​SQL数据库使用身份验证,而不是htpassword,因为我曾经说过这样的研究并不安全。此外,它不允许用户注销哪些不是我想要的。我只是想阻止任何人将文件的完整路径输入到他们的浏览器,这将自动允许他们下载它。 – mileaminute 2013-02-26 18:17:55