【问题标题】:Where should I allow uploads and downloads to be saved to? [closed]我应该允许将上传和下载保存到哪里? [关闭]
【发布时间】:2013-07-23 18:09:18
【问题描述】:

我担心安全问题。我需要允许特定的用户组上传文档并允许所有其他用户下载它们。

在哪里或哪个文件夹是允许这种情况发生的最佳位置?我读到网站根目录之外的内容最好,但后来我读到了相互矛盾的帖子。

感谢您的帮助。

【问题讨论】:

  • 尝试查看Security SE 或询问是否没有有用的答案。
  • 好的,谢谢。我去看看。

标签: php html file-upload download


【解决方案1】:

这完全取决于上传后您需要对它们做什么。

在网络根目录之外绝对是最好的,但如果您需要能够在网页上显示这些文件,您将需要编写一个处理程序或将它们保存在网络根目录中。

理想情况下,您不应该允许不受信任的用户将任何文件上传到服务器,当然也不应该允许不受信任的用户将文件上传到 webroot,因为他们可能会使用您的服务器传播恶意软件或上传可以在服务器上执行的文件并控制您的服务器或网站。

您应始终确保允许上传的文件类型尽可能少,因此如果用户上传图片,请确保他们只能上传图片

【讨论】:

  • 您好,感谢您的回答。将要上传的组将被信任(这是他们的站点)。我需要在其他页面上显示文档列表,以便其他用户可以查看和下载它们。我将使用各种黑名单来确保只能上传 pdf 等文件。
【解决方案2】:

我通常将文件保存到 web 根目录之外的文件夹中(注意,不仅在我的站点根目录之外,而且在实际的 web 根目录之外)。您只询问了最好的文件存储位置的建议,但可能您正在采取其他步骤来确保上传文件的安全(例如,更改文件的名称、更改文件的权限等)。祝你好运!

【讨论】:

  • 嗨,我不打算更改这些特定文件的名称。这样做有什么好处?如果它被称为“培训讲义 1.pdf”,那么我希望能够从数据库中提取它并将其显示在另一个页面上,作为 soemone 下载的链接。和权限..你介意解释一下吗?
  • @user2608855 这样想吧。您有一个文件夹上传,您将所有内容存储在那里。用户 A 上传了一个名为“abc.pdf”的文件,用户 B 上传了另一个名为“abc.pdf”的文件。他们不一样,那你现在会怎么做?我看到了以下解决方案:当有人上传文件时,您将文件重命名为唯一的文件名(例如散列+时间戳?)并将其存储在文件夹 uploads 中。您将原始文件名与唯一文件名一起存储在数据库中,以便您始终可以检索它们。如果需要,您还可以添加有关该文件的其他信息。
  • 好吧,您不希望有人上传他们可以在您的网络服务器上找到的可执行文件(具有可执行权限的文件)(因为他们知道它的名称)并运行。所以,我会检查上传文件的 mime 类型,以确保它是您愿意接受的文件类型(例如 PDF 或 RTF 文件),然后,我会更改它的名称,所以你知道它的名字,但上传者不知道。然后,使用 chmod,我将文件的权限更改为 0644 php.net/manual/en/function.chmod.php
  • @HamZa 我明白了,抱歉,我的想法有点狭隘,因为上传者不会使用相同的文件名,但我想我可以将它与日期连接起来。这将保持原始文件名的完整性并使其独一无二(包括您建议的时间戳)
  • @user2608855 不够,否则你会希望2个用户不要同时上传相同的文件名:p
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2010-09-19
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多