为了安全起见,我将一组文件和文件夹移到apache服务器上的web根目录之外,然后我将动态地为它们提供服务。 这看起来好于2个替代方案:
因此我们回到将它们置于Web根目录之外,但动态地为它们提供服务。我遇到的问题是,因为它们都是不同的文件类型(php脚本,txt,pdf,jpg)我不确定是否应该使用include()
或readfile()
。我遇到的问题是为每个文件发送正确的标题,以便浏览器正确显示它们。
我错过了另一个神奇的解决方案吗?是否有一个框架让我无法处理动态文件和标题的提供?
(仅供参考我在共享主机上运行Linux,Apache和PHP)
答案 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: - )