PHP文件上传,安全吗?

时间:2010-10-19 22:53:36

标签: php security apache upload

这就是我希望用户能够:

  • 将任意文件上传到服务器(附件)到上传文件夹
  • 以后能够下载

所以我用以下.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

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

3 个答案:

答案 0 :(得分:6)

我想说:没有

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

为什么:您永远不会知道将来会发生什么,某些文件以后可以执行,在其他地方放置一个不安全的脚本,允许用户包含这些上传的文件,等等。

答案 1 :(得分: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');
?>

这样,您可以将所有文件保留在Web目录根目录之外,因此外部世界完全无法访问。你根本不用担心.htaccess。

如果你的主机允许你安装新的Apache模块,你需要安装apxs(可能会)。如果未安装,则需要在启用apx的情况下重建Apache。根据我的经验,如果你可以管理它,那是值得的。 XSendFile省去了很多麻烦。

答案 2 :(得分:0)

我同意通过特殊脚本下载它们会好得多。但如果不可能,那就做两件事:

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