安全的PHP文件上传

时间:2009-03-18 19:00:47

标签: php apache .htaccess security file-upload

我正在尝试在我们的新网站上开发一个文件上传模块,允许您将任何文件上传到我们的服务器。上传的文件上传到/files,其中以下.htaccess用于阻止用户执行,即.php文件:

<Files *.*>
ForceType applicaton/octet-stream
</Files>

这会触发浏览器下载窗口(至少在FF和Safari中),但是可以安全地假设使用此方法不会在服务器上运行该文件吗?如果没有,您将如何实施这样的解决方案?

6 个答案:

答案 0 :(得分:3)

我认为最安全的做法是限制对目录的100%Web访问,并使用类似download.php的脚本,通过该脚本传递文件ID,然后获取适当的文件并将其输出到浏览器。但是,我很确定你拥有的东西会起作用并且是安全的。

答案 1 :(得分:2)

  

是否可以安全地假设使用此方法不会在服务器上运行文件?

有点,但这取决于你的配置中还有其他指令;也许还有其他规则设置允许PHP文件运行。如果您启用PHP的唯一方法是在文件类型上键入PHP处理程序,那应该会阻止PHP执行。

然而,停止执行PHP只是您的担忧之一。如果人们上传包含活动内容的文件(例如HTML或Flash) - 即使文件类型显示它是无辜的图像 - 他们也可以通过跨站点脚本(XSS)控制您网站上其他用户的会话。有关此问题的讨论,请参阅Stop people uploading malicious PHP files via forms

使用Content-Disposition始终触发下载框的'download.php'界面,加上将文件存储在非用户提供的文件名(如'1234.dat')下,更加安全。

答案 2 :(得分:1)

我认为你真的想要这个:

<Directory /path/to/files>
    SetHandler default-handler
</Directory>

你在实践中可能会有什么工作,因为默认情况下服务器配置为不执行任何操作,除非特别说明这样做,但它并不能保证不会执行任何操作。 ForceType只设置静态文件的内容类型(我不确定,但我怀疑它会影响可执行脚本)。

答案 3 :(得分:1)

借调Paolo的回答,将您的文件目录移出可访问的路径。然后,您可以使用PEAR的HTTP_Download模块编写download.php脚本来提供文件。

答案 4 :(得分:0)

我同意Paolo,他的方式更安全。总是会有人利用您的PHP文件来执行上传的文件。不好的例子:

include_once("/modules/".$_GET["module"].".php");

有人传入module=../Files/exploit

答案 5 :(得分:0)

为了最大限度地提高安全性,您应该从包含no-exec标志的单独分区安装包含上载文件的文件夹。