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
}
我正在创建一个带有网络界面的文件存储库。用户将能够登录(简单的 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
}