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

时间:2013-02-26 00:05:58

标签: php mysql apache download

我正在使用PHP和MySQL数据库创建会员网站,我有办法让用户使用他们的用户名和密码登录。所有非常标准的东西。

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

但问题是,任何能够找出文件系统的人都可以直接下载这些文件。

假设我们的主文件夹中包含名为“视频”的视频内容,而在“视频”中,我们有子文件夹,例如“飞机”,“火车”和“汽车”,每个文件夹中都有单独的文件夹(例如作为'飞机'的'喷气机','道具'和'间谍'),每个子类别都有特定的视频。

因此,如果有人知道文件系统,他们只需键入https://www.myvideosite.com/videos/planes/jets/f15.wmv并下载到他们心中的内容,前提是他们知道文件名。 (如您所见,我有一个安全的连接,它位于运行Linux的Apache服务器上。)

这是一个主要的安全漏洞,我想在它被发现之前插入。我已经研究了.htaccess的事情,但我的努力经常导致整个“视频”文件夹无法访问(我承认,我是所有这一切的新手!)。

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

简单地说,我怎么能禁止那些不是成员但可能发现(通过任何方式)文件系统是什么的人下载?在我看来,这应该很简单,但唉,我找不到可靠的答案。

3 个答案:

答案 0 :(得分:4)

您可以使用.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);
}

答案 1 :(得分:0)

如果你遇到.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 );
}

?>

答案 2 :(得分:0)

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

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