代码之家  ›  专栏  ›  技术社区  ›  Tomasz Kasperczyk

PHP-本地文件存储安全

  •  0
  • Tomasz Kasperczyk  · 技术社区  · 8 年前

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

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

    我应该如何处理这个问题?将它们作为BLOB存储在数据库中是个坏主意,因为每个文件都有1.5G以上的内存。

    更新

    对于任何与同一问题斗争的人: 我这样做了 Sherif 他在回答中暗示。您需要安装 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>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Sherif    8 年前

    如果您希望用户通过PHP进行身份验证,并访问文档根目录之外的文件,那就可以了。只需执行普通身份验证,然后您就可以使用 X-Sendfile header让web服务器从文件系统的任何位置提供文件。请参阅web服务器的文档,了解如何启用sendfile:例如。 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
    }
    
    推荐文章