PHP - 本地文件repo安全性

时间:2016-08-10 10:44:20

标签: php apache file-storage

我正在创建一个带有Web界面的文件存储库。用户将能够登录(简单的PHP授权系统)并浏览存储在服务器上的文件。每个目录都有一个名称,用于确定它所属的用户。

我正在努力保护整个事情 - 我不能简单地将所有文件都放到文档根目录中,因为每个人都可以访问它们。与此问题相关的所有答案都表明,所有私有和敏感数据都应放在文档根目录之外。 这就是我所做的,但现在我无法找到一种方法在用户登录时向用户显示这些文件。

我该如何处理这个问题?将它们作为BLOB存储在数据库中是一个坏主意,因为每个文件都超过1.5G。 事实上这些是使用javascript插件播放的视频文件也很重要 - 它们需要由用户的浏览器直接访问。

更新

对于遇到同样问题的人: 我在答案中建议Sherif做了。您需要安装mod_xsendfile并添加

XSendFile On
XSendFilePath "/var/www/"

<Directory>部分的apache配置文件。当然,修改路径以满足您的需求。然后创建一个PHP文件来处理请求。这是一个类似PHP的伪代码示例:

$file = $_GET["file"];
if (user_logged_in() && user_allowed_to_download($file)){
    $absoluteFilePath = "/var/www/".$file;
    header("X-Sendfile: ".$absoluteFilePath);
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$file);
}

然后你可以像jwplayer,VLC等一样使用它:

<div class="embed_vlc_wrapper">
    <embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" version="VideoLAN.VLCPlugin.2"
        width="500"
        height="500"
        version="VideoLAN.VLCPlugin.2"
        target="http://localhost/xsend.php?file=1.mp4"
        pluginspage="http://www.videolan.org"
    />
</div>

1 个答案:

答案 0 :(得分:1)

如果您希望用户通过PHP进行身份验证并访问文档根目录之外的文件,那很好。只需进行正常身份验证,然后您就可以使用X-Sendfile标头让您的Web服务器从文件系统上的任何位置提供文件。有关如何启用sendfile的信息,请参阅Web服务器的文档:例如Apache httpdNginx

所以这是基本的想法......

if (isset($_SESSION['user_authenticated'])) { // or however you verify the user
    header('X-Sendfile: ', $pathToFileForDownload); // your web server will do the rest
}