2011-05-04 76 views
5

在我的项目中,用户可以上传任何类型的文件。我需要确保执行上传的文件,可以解析php(* .php,*。html等)的安全防止执行上传的php文件?

有没有办法告诉Apache不要用PHP解析任何文件在web/uploads和只需将它们显示为纯文本?什么是其他选项?

+1

如果你想让它们只显示为纯文本文件,为什么不在上传时将它们重命名为filename.txt?或者,如果你正在寻找'保留原来的扩展名,filename.php.txt。这将不会被执行,将被视为一个文本文件。 – 2011-05-04 15:13:50

+0

如果客户想下载文件并在他的机器上执行文件,这会增加客户端的一些开销。如果您隐藏了扩展名,只需在Windows上对其进行成像即可。 =) – Dziamid 2011-05-04 15:32:21

回答

11

让他们所有的同一个文件夹下,并设置该线在该目录中的文件.htaccess

php_flag engine off 

这也将照顾其他漏洞,如.gif文件中嵌入PHP代码。

+0

这工作。但是,如果该文件是* .php,则浏览器尝试下载文件。在这种情况下,我怎样才能得到“Content-Type \t text/plain”标题? – Dziamid 2011-05-04 15:28:37

+1

@Dziamid:我自己并没有尝试过,但我相信'AddType text/plain .php'应该可以做到。 – Kaivosukeltaja 2011-05-04 18:36:19

0

为什么不直接将文件扩展名重命名为.phps

为了澄清PHPS是一个PHP文件的源代码视图:

澄清:

file.php =>file.phps

快速谷歌例如:

+0

这很简单,但我想保留原来的名字。 – Dziamid 2011-05-04 15:17:35

+0

不,你不会误解你改变扩展名,不是文件名'file.php'变成'file.phps'几乎没有什么大的改变。 – Jakub 2011-05-04 15:19:21

+1

不,我明白。我希望用户下载文件,而不必重命名扩展名以便能够在他们的机器上执行它。 – Dziamid 2011-05-04 15:30:41

2

你想在Apache SetHandler指令:http://httpd.apache.org/docs/current/mod/core.html#sethandler

这可以强制目录中的所有文件,通过一定的处理程序进行处理。所以沿线的东西:

<Location /web/uploads> 
SetHandler None 
</Location> 

应该做你想做的。

+0

这很好。 * .php文件与“Content-Type \t text/html”标题相关。我可以通过.htaccess达到同样的效果吗? – Dziamid 2011-05-04 15:38:15

+0

我假设你可以做同样的事情:文档说它可以在.htaccess文件中使用。 – Femi 2011-05-04 15:46:19

+0

确实文档说可以,但它在.htaccess上下文中没有任何作用。我将AllowOverride设置为虚拟主机中的全部。 – Dziamid 2011-05-04 16:37:27