如何使用PHP从web根目录外提供文档


How to serve documents from outside the web root using PHP?

出于安全考虑,我将一组文件和文件夹移动到apache服务器的web根目录之外,然后我将动态地为它们提供服务。这似乎比两个选项要好:

  1. 让他们web访问,只是创建一个php登录页面,得到前置到每个文件。问题是它们不是所有的php文件,我不能把php登录文件附加到pdf,图像等。
  2. 让它们可以web访问,并使用HTTP身份验证来限制对整个目录的访问。但是这会带来一些问题,包括明文密码,没有优雅的注销方法等。

所以我们又回到了把它们放在web根目录之外,但是动态地为它们服务。我遇到的问题是,因为它们都是不同的文件类型(php脚本,txt, pdf, jpg),我不确定我是否应该使用include()readfile()。我在为每个文件发送正确的标题以使浏览器正确显示它们时遇到了问题。

我错过了另一个神奇的解决方案吗?是否有一个框架,逃避了我,处理动态文件和头的服务?

(仅供参考,我正在运行Linux, Apache &;

我想这样可以:

<?php
$path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']);
$parts = explode('/', pathinfo($path, PATHINFO_DIRNAME));
if (end($parts) !== 'my_files') {
    // LFI attempt
    exit();
}
if (!is_file($path)) {
    // file does not exist
    exit();
}
header('Content-Type: ' . mime_content_type($path));
header('Content-Length: ' . filesize($path));
readfile($path);

我能想到的最简单的方法是使用。htaccess文件。当然,假设你的web服务器是Apache。

你可以拒绝所有人访问任何类型的文件和/或目录,只允许本地主机访问。这样,即使它们知道正确的路径/url,它们也不会被提供给公众,但服务器和PHP将能够为它们提供服务。

对于不同的web服务器,必须有相同的解决方案。另外,您可以随时切换到Apache:-)