1

我有一个简单的网站,允许用户上传文件(当然还有其他内容)。我正在自学php/html。

目前该站点具有以下特点: --当用户注册时,会以他们的名字创建一个文件夹。--用户上传的所有文件都放置在该文件夹中(名称中添加了时间戳以避免任何重复问题)。--当一个文件被上传时,关于它的信息被存储在一个 SQL 数据库中。

简单的东西。

所以,现在我的问题是我需要采取哪些步骤:

  • 阻止谷歌存档上传的文件。
  • 禁止用户访问上传的文件,除非他们已登录。
  • 防止用户上传恶意文件。

笔记:

我假设 B 会自动实现 A。我可以限制用户只上传带有 .doc 和 .docx 扩展名的文件。这足以对抗 C 吗?我会假设不会。

4

3 回答 3

1

您想做很多事情,而且您的问题非常广泛。

  • 对于 Google 索引,您可以使用 /robots.txt。您没有指定是否还想将 ACL(访问控制列表)应用于文件,因此这可能不够,也可能不够。通过脚本提供文件可能会起作用,但您必须非常小心,不要使用可能会被欺骗执行代码的 include、require 或类似的东西。相反,您希望打开文件,读取它并通过文件操作原语提供它。

  • 阅读“路径遍历”。您想在上传和下载中避免这种情况(如果您以某种方式提供文件)。

  • “恶意文件”的定义相当广泛。对谁恶意?例如,如果您担心自己的一方被用来分发恶意软件(您应该这样做),您可以在 uplaod 上运行防病毒软件。如果你想确保人们不会损害服务器,你至少要确保他们只能上传一堆文件类型。检查扩展和 mimetype 是一个开始,但不要相信这一点(您可以在 png 中嵌入代码,如果它通过 include() 包含它是有效的)。然后是 XSS 的问题,如果用户可以上传 HTML 内容或被解释为这样的东西。确保提供内容处置标头和非 html 内容类型。

这是一个开始,但正如你所说,还有更多。

于 2012-06-12T16:12:15.440 回答
0

您最大的威胁将是如果有人设法上传带有.php扩展名的文件(或导致服务器端脚本/处理的其他扩展名)。文件中的任何代码都在您的服务器上运行,具有 Web 服务器具有的任何权限(因配置而异)。

如果上传的最终结果只是您希望能够将文件作为下载提供(而不是让某人直接在浏览器中查看它们),那么您最好将下载存储在不可访问的网络中目录,并通过脚本提供文件,该脚本强制下载并且无论扩展名如何都不会尝试执行任何内容(请参阅http://php.net/header)。

这也使得仅在一个人登录时才允许下载变得更加容易,而在此之前,您需要一些.htaccess魔法来实现这一点。

于 2012-06-11T22:23:48.470 回答
0

如果您不希望文件可用,则不应上传到 Web 服务器服务目录。

我建议您使用 X-Sendfile,它是指示服务器向用户发送文件的标头。您的名为“获取某某文件”的 PHP 脚本将执行您已进行的任何身份验证(我假设您已经拥有某些内容),然后返回标头。只要网络服务器可以访问该文件,它就会提供该文件。

看到这个问题:使用 X-Sendfile 和 Apache/PHP

于 2012-06-11T22:24:09.237 回答