PHP保护文件访问

时间:2012-06-25 15:28:24

标签: php protected file-access

我正在使用Martin Barker的代码/答案(PHP to protect PDF and DOC)几乎是verbatum,唯一的区别是我保护的文件位于public_html文件夹上方的用户文件夹中

文件夹结构

/users/websupport
/public_html

要下载的文件位于:

/users/websupport/FileToDownload.pdf

download.php文件位于

/public_html/download.php

但Firefox告诉我它找不到Firefox上的文件,无法在download.php找到该文件。

我已通过ftp确认该文件存在。

如果将文件放在webroot之外,我是否需要向网站添加内容.htaccess?只是不确定我在哪里出错。下面是download.php中的代码

//check users is loged in and valid for download if not redirect them out
// YOU NEED TO ADD CODE HERE FOR THAT CHECK
// array of support file types for download script and there mimetype
$mimeTypes = array(
    'doc' => 'application/msword',
    'pdf' => 'application/pdf',
);
// set the file here (best of using a $_GET[])
$file = "../users/websupport/2011cv.pdf";

// gets the extension of the file to be loaded for searching array above
$ext = explode('.', $file);
$ext = end($ext);

// gets the file name to send to the browser to force download of file
$fileName = explode("/", $file);
$fileName = end($fileName);

// opens the file for reading and sends headers to browser
$fp = fopen($file,"r") ;
header("Content-Type: ".$mimeTypes[$ext]);
header('Content-Disposition: attachment; filename="'.$fileName.'"');

// reads file and send the raw code to browser
while (! feof($fp)) {
    $buff = fread($fp,4096);
    echo $buff;
}
// closes file after whe have finished reading it
fclose($fp);

2 个答案:

答案 0 :(得分:0)

确保您的php脚本运行的用户具有对该目录的读访问权。

在大多数debian衍生品的apache中嵌入的php中,用户将是'www-data'。

答案 1 :(得分:0)

我最近遇到了同样的问题,其中readfile()和fpassthru()在我的服务器上无效。

我最终做的是根据需要为文件创建符号链接并将其传递给用户。您可以了解如何创建符号链接here

我用过

exec("ln -s source_file_full_path full_path_to_fake_file");

如果您希望您的用户拥有类似“http://somesite.com/folder/fake_file.pdf”的链接,那么完整路径就是服务器上“文件夹”的位置,您可以在假文件路径中包含“fake_file.pdf”。

然后过期链接我再次调用以查找创建日期早于x分钟的所有符号链接。您可以在this answer中查看如何执行此操作。 (这可能是确保他们按时到期的一项重要工作。)