如何使用PHP从Web根外部提供文档?

时间:2011-10-09 06:12:34

标签: php

为了安全起见,我将一组文件和文件夹移到apache服务器上的web根目录之外,然后我将动态地为它们提供服务。 这看起来好于2个替代方案:

  1. 让他们可以访问Web,只需创建一个php登录页面,该页面将被添加到每个文件中。问题是它们不是所有的php文件,我不能将php登录文件添加到pdf,图像等。
  2. 让他们可以访问Web并使用HTTP身份验证来限制对整个目录的访问。但这会带来问题,包括明文密码,没有优雅的退出方法等等。
  3. 因此我们回到将它们置于Web根目录之外,但动态地为它们提供服务。我遇到的问题是,因为它们都是不同的文件类型(php脚本,txt,pdf,jpg)我不确定是否应该使用include()readfile()。我遇到的问题是为每个文件发送正确的标题,以便浏览器正确显示它们。

    我错过了另一个神奇的解决方案吗?是否有一个框架让我无法处理动态文件和标题的提供?

    (仅供参考我在共享主机上运行Linux,Apache和PHP)

2 个答案:

答案 0 :(得分:9)

我认为这样的事情会起作用:

<?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);

答案 1 :(得分:1)

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

您可以拒绝为每个人访问任何类型的文件和/或目录,并仅允许localhost。这样,即使他们知道正确的路径/网址,也不会向公众提供服务,但服务器和PHP将能够为他们提供服务。

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