2010-10-19 148 views
1

这就是我想要的用户能够:PHP文件上传,安全?

  • 上传任何文件到服务器(附件)的上传文件夹
  • 可以下载它之后

所以我有创建此目录与以下.htaccess

Allow from all 
DirectoryIndex .x 
php_flag engine off 
Options -Indexes 
Options -ExecCGI 
AddType text/plain .html .htm .shtml .php .php3 .php5 .phtml .phtm .pl .py .cgi 
ForceType applicaton/octet-stream 

我的问题是,这是安全的吗?

+1

可能是值得标注这是“阿帕奇”,因为.htaccess文件是为Web服务器,PHP没有这样。 – 2010-10-19 23:23:20

+1

那么什么是阻止某人上传.php文件并执行它? – rook 2010-10-20 00:28:07

回答

6

我想说:没有

如果拒绝所有访问,并通过该deliveres文件的脚本管理下载它应该是更安全的。 此外,您应该重命名文件,以便在那里例如没有人会放置自己的htaccess或其他任何东西。 您可以存储在数据库中的原始文件名。

为什么:你永远不会知道未来会发生什么,有些文件后可以得到可执行文件,别的地方你把一个不安全的脚本,使用户可以包括那些上传的文件,等等。

+0

所以,我重命名文件的MD5(“测试”),例如,用脚本提供下载,将上传outsite WWW和他们的.htaccess“从所有拒绝”? – Simon 2010-10-19 23:35:48

+0

是的,这会更安全。另外,你应该确保服务器上你自己的任何脚本都不能包含这些文件中的一个(这不能通过.htaccess完成,你必须将open_basedir设置为不包含上传文件的目录路径)文件夹)。如果您将目录放置在DOCUMENT_ROOT之外,则不需要.htaccess,但目录无法通过HTTP访问 – 2010-10-20 02:13:02

0

我同意,这将是更好的通过特殊的脚本下载它们。但是,如果它是不可能的,做两件事情:

  1. 如果你希望用户能够下载文件,你可以添加附件HTTP响应头 Header set Content-disposition "attachment" 这将迫使浏览器下载文件,而不是渲染它。 但是,您必须确保文件不会通过文件包含等其他潜在漏洞进行访问。
  2. 禁止执行文件上传目录中chmod -R a-x
4

我也Dr.Molle同意,你应该重命名文件和动态发送。

但是,而不是通过一个脚本,这会占用更多的内存比需要送他们,我强烈建议使用mod_xsendfile为Apache。

随着mod_xsendfile,而不是通过PHP输出文件,你可以简单地发送XSendFile标题:

<?php 
    header('Content-Disposition: attachment;filename=originalname.txt'); 
    header('X-Sendfile: /path/to/file.txt'); 
?> 

这样,您就可以把所有的文件OUTSIDE网站根目录,因此完全无法接触到外面的世界。你根本不用担心.htaccess。

如果你的主机允许你安装新的Apache模块,你需要安装APXS(它可能会)。如果未安装,则需要使用apxs重新启动Apache。根据我的经验,如果你可以管理它,这是值得的。 XSendFile节省了很多麻烦。