PHP -本地文件回购安全


PHP - local file repo security

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

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

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

对于有同样问题的人:我照谢里夫的回答做了。您需要安装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头让您的web服务器从文件系统上的任何位置提供文件。关于如何启用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
}