允许用户查看或下载文件,但不执行它们

时间:2012-10-05 22:57:06

标签: php file-permissions

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

有些文件,比如JPG文件,很容易:浏览器有一个内置系统来显示它们,我们都知道。

其他文件(如PDF文件)无法直接显示,因此浏览器会提示用户下载屏幕。太好了。

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

<?php echo 'ok'; ?>

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

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

对我来说,最合理的方法是将文件权限设置为644,以便用户只能读取文件。但在这样做之后,PHP文件不断执行。

2 个答案:

答案 0 :(得分: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时,它永远不会在服务器上执行,但它只会请求文件。

答案 1 :(得分:0)

我通过脚本显示文件解决了问题,而不是直接从他们的真实位置显示。该脚本取自an answer to a previous question of mine

$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',上面的脚本会提示他们下载屏幕,或者在浏览器中显示文件,如果浏览器能够这样做。