Php Web应用程序,用户上传文件夹的最安全位置

Php Web应用程序,用户上传文件夹的最安全位置,php,web-applications,upload,permissions,directory,Php,Web Applications,Upload,Permissions,Directory,我的申请的一般结构: [includes] - not accessible by the web .. important database classes, etc [public] .. all files that the application publicly uses 我正试图决定将[uploads]文件夹存储在哪里。这是所有用户存储媒体(图像等)的地方 目前,我在[public]文件夹中有这个文件夹,但出于某种原因,我不相信这是正确的位置 公众将无法访问[includes]文件

我的申请的一般结构:

[includes] - not accessible by the web
.. important database classes, etc
[public]
.. all files that the application publicly uses
我正试图决定将
[uploads]
文件夹存储在哪里。这是所有用户存储媒体(图像等)的地方

目前,我在
[public]
文件夹中有这个文件夹,但出于某种原因,我不相信这是正确的位置

公众将无法访问
[includes]
文件夹,只有PHP能够在那里导航


为了最佳实践,您对此有何想法?

在兄弟目录中。也就是说,与
相同级别的目录包括/
公共/
,这取决于您试图实现的目标。如果您正在上载例如用户文章的照片,请将它们放在公共可见文件夹中,例如
/public/images
(无论哪种方式,图像都是可见的)。另一方面,如果你制作的应用程序将(例如)从上传的文件中获利,那么最好将它们放在更高的级别,例如
/uploads
,这样它们就不会被公开访问,但是你可以创建一个代码来启用下载


我想只有那个用户。我的意思是,在谈话中不引入“共享”媒体。。。这是今后的一种可能性

在这种情况下,通常的设置是

  • 将文件放在web根目录之外(即
    public
    文件夹之外-具体位置由您决定)

  • 构建一个PHP脚本,该脚本检查用户权限,并在所有内容都检查无误时通过请求的文件。然后将为每个资源调用该PHP脚本,如下所示:

    domain.com/resource.php?user=user123&file=mypic.jpg

    (或者使用漂亮的URL重写)

但是,请记住,这需要为每个请求的资源启动一个昂贵的PHP进程。确保使用非常聪明的缓存来最小化请求


有一些Apache和nginx模块使这个过程更加高效。这可能值得一看。

媒体安全是否敏感?@Pekka,不,我不这么认为。但是如果我真的想保证它们的安全,那么最好的结构是什么呢?应该允许任何人访问
/user123/mypic.jpg
还是只允许user123?我想只有那个用户。我的意思是,在谈话中不引入“共享”媒体。。。这是一种可能。是的,这正是我所想的。有什么缺点吗?如果您处于安全模式,那么您需要在例外列表中添加另一个路径。此外,您不能直接提供这些文件;但这就是mod_sendfile的用途。浏览器需要能够将这些图像导入。该应用程序的目的是允许用户设计“演示文稿”,然后将其发送给其他人。情况很简单:公共文件转到
web/X
public/X
,如果您想施加任何限制,您需要将其隐藏一级以上。很明显,你可以创造一些htaccess魔法,但我不推荐。因此,如果我需要将这些图像带到公众使用的界面中,我不能让“uploads”目录处于与“public”相同的级别或更高的级别?如果您将这些文件放入
public/X
中,它们是公开可见的,您无法控制谁可以看到什么。如果你把它们放在更高的级别,你需要创建一些“桥梁”,比如PHP文件,用来读取图像并将其输出到浏览器。唯一的问题是公众是否能够“看到”媒体。图像将被带到一个界面中,公众可以将其作为演示文稿的一部分进行查看。@dcolumbus因此该文件应该是全世界都可以访问的,而不仅仅是用户123?但这不是您上面所说的?最终,该文件将被公众查看,但只能通过user123创建的界面查看。啊。在这种情况下,将
uploads
文件夹存储在
public
中,没有问题
uploads
目录与
public
目录处于同一级别,并且仍然能够在界面请求时向浏览器提供文件?
[uploads]
   [user123]
      mypic.jpg
      mysecondpic.jpg
   [user456]
      picpic.jpg
      yeah.jpg