PHP - 本地文件回购安全

PHP - local file repo security

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

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

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

更新

对于遇到同样问题的任何人: 我做了 Sherif suggested in his answer. You need to install mod_xsendfile 并添加

XSendFile On
XSendFilePath "/var/www/"

到您的 Apache 配置文件的 <Directory> 部分。当然修改路径以满足您的需要。然后创建一个 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>

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

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

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