0

我正在制作一个允许用户上传任何类型文件的网站。所有文件都存储在“files/”文件夹中。我希望用户能够查看和下载该文件夹中的任何文件,但不能执行它们。

一些文件,如 JPG 文件,很简单:众所周知,浏览器有一个内置系统来显示它们。

其他文件,如 PDF 文件,无法直接显示,因此浏览器所做的就是提示用户下载屏幕。那也很好。

但是,其他文件(如 PHP 文件)会带来问题。当我打开一个这样的文件时,如果我不小心,它就会被执行。例如,如果文件包含

<?php echo 'ok'; ?>

然后当我转到“files/myphpfile.php”时,我看到的只是“ok”,而不是文件的内容。我想这不仅会发生在 PHP 文件中,而且还会发生在我的服务器可以执行的任何其他文件类型(例如 ASP 文件,我想)中。

我需要的是阻止用户执行文件,这样当他们转到“files/myphpfile.php”时,他们要么看到文件内容,要么浏览器提示他们下载屏幕。理想情况下,这将是一个通用解决方案,不需要我构建服务器可执行的每种文件类型的列表。

对我来说,最合理的做法是将文件权限设置为 644,这样用户就只能读取文件。但这样做之后,PHP 文件会继续执行。

4

2 回答 2

2

去下载:

header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename=somefile.php');
header('Pragma: no-cache');
readfile('/path/to/somefile.php');

显示:

echo htmlspecialchars(file_get_contents('/path/to/somefile.php'));

更新

当我打开一个这样的文件时,如果我不小心,它就会被执行

这就是为什么您没有指向该文件的直接链接。即文件不应该被上传到文档根目录内的某个位置。如果文件被上传到文档根目录之外的目录,人们无法通过 URL 直接访问它,例如:http://example.com/files/somefile.php.

我想这不仅会发生在 PHP 文件中,而且还会发生在我的服务器可以执行的任何其他文件类型(例如 ASP 文件,我想)中。

您是唯一可以判断哪些文件可能存在危险的人。我们不知道您是否有一些服务器也提供(和解析)asp 文件,也不知道那里可能还有其他潜在的危险文件。

我需要的是阻止用户执行文件,这样当他们转到“files/myphpfile.php”时,他们要么看到文件内容,要么浏览器提示他们下载屏幕。

请参阅上面我已经提供的解决方案。

对我来说,最合理的做法是将文件权限设置为 644,这样用户就只能读取文件。但这样做之后,PHP 文件会继续执行。

这是因为 PHP 文件没有被执行。它们只是被解析(即被网络服务器读取)。

所以基本上你需要找出可能的危险文件类型(还要考虑可能被 PHP 解析的其他文件,例如.phtml或其他文件)。用户无论如何都不能通过 HTTP 请求调用可执行文件。因为当我这样做时http://example.com/run-virus.exe,它永远不会在服务器上执行,但它只请求文件。

于 2012-10-05T23:00:53.813 回答
0

我通过脚本显示文件解决了这个问题,而不是直接从它们的真实位置显示。该脚本取自我以前的问题的答案

$fileinfo = finfo_open( FILEINFO_MIME_TYPE );

header( 'Content-Type: ' . finfo_file( $fileinfo, 'files/' . $filename ) );

finfo_close( $fileinfo );

readfile( 'files/' . $filename );

所以现在想要看到'files/myfile.php'的用户必须去'open/myfile.php',上面的脚本会提示他们下载屏幕,或者在浏览器中显示文件,如果浏览器能够这样做。

于 2012-10-06T01:26:15.557 回答