在MVC php应用程序中管理文件(上传/下载)

在MVC php应用程序中管理文件(上传/下载),php,file,security,model-view-controller,Php,File,Security,Model View Controller,我正在做一个小项目(遵循MVC模式),它基本上提供了一个受保护的页面,每个用户都可以下载一些选定的文件(基于管理员和用户决定的所有权)。这些文件由“管理员”用户上载。只有当用户是所有者时,他们才能查看列表/下载文件,否则不会显示任何内容 现在,我有点担心安全性,我不知道哪种方法更好 我的想法是什么 管理面板:一个简单的表单,允许(多个)文件上传,将它们存储在某处,然后将路径保存到db表中 用户页面:登录后,函数在数据库中的“存储文件”表中查找用户拥有的文件。如果有,获取路径并在表/列表中显示它

我正在做一个小项目(遵循MVC模式),它基本上提供了一个受保护的页面,每个用户都可以下载一些选定的文件(基于管理员和用户决定的所有权)。这些文件由“管理员”用户上载。只有当用户是所有者时,他们才能查看列表/下载文件,否则不会显示任何内容

现在,我有点担心安全性,我不知道哪种方法更好

我的想法是什么

  • 管理面板:一个简单的表单,允许(多个)文件上传,将它们存储在某处,然后将路径保存到db表中

  • 用户页面:登录后,函数在数据库中的“存储文件”表中查找用户拥有的文件。如果有,获取路径并在表/列表中显示它们。用户应该能够通过简单的点击链接下载它们

第一个问题:我应该在哪里保存上传的文件?某条路比另一条好吗? 第二:通过这种方式,每个用户都应该看到他的文件列表和下载它们的链接。但它是安全的吗?有没有更好的方法来保护这些文件免受未经授权的访问? 第三:存储文件。我想为每个用户创建一个目录,并在那里保存用户的文件。这是个好主意吗

还有其他需要注意的提示吗? 用户不能上传任何东西,他们只能下载,这应该可以避免很多问题

我希望这是清楚的:)


谢谢大家!

devfe,我已经实现了一些类似于您所做的事情,但我不是专家,所以我将在这里分享,在评论中,也许更多的专家可以评论/回答。我的服务接受两个请求(都是GET请求):可以下载的文件列表;以及下载特定文件的请求。显示列表时,它会显示文件的唯一字符串,而不是文件的路径。如果用户想要一个文件,他们会发出一个GET请求,其中请求行包含唯一的字符串,请求头包含用户名和密码。而且,我认为,只要文件不在/htdocs中,将文件存储在哪里并不重要……也就是说,不要放在可通过浏览器访问的目录中(根据您的.htaccess设置).Thank@Craig!我不确定我是否理解您为每个文件显示唯一字符串的选择…对于每个文件,您创建一个ID,然后显示此ID而不是路径,为了下载文件,用户使用此ID发出请求,对吗?所以您需要将唯一字符串与文件路径一起存储,对吗?谢谢!好问题:我确实存储了ID(可以是数据库或简单的文本文件).I散列文件的唯一路径,即呈现给用户的唯一id,例如/sample_folder/sample_file.txt使用一些php散列函数(如base64)转换为“jaosidr823ddku”。当请求文件“jaosidr823ddku”时,将搜索unqiue id列表以查找文件的对应路径。抱歉由于延迟,我丢失了这个线程。无论如何,谢谢你的建议!我为每个文件创建了一个唯一的字符串,并添加了一个用户名检查…它可能并不完美,但对于我的需要来说应该是相当安全的。谢谢!devfe,我已经实现了一些类似于你所做的事情,但我不是专家,所以我将在这里、评论中和每个人分享希望有更多的专家可以评论/回答。我的服务接受两个请求(都是GET请求):可以下载的文件列表;以及下载特定文件的请求。显示列表时,它显示文件的唯一字符串,而不是文件路径。如果用户需要文件,他们会发出GET请求,其中请求行包含唯一字符串,请求头包含用户名和密码而且,我认为只要文件不在/htdocs中,文件存储在何处并不重要……也就是说,不要放在可通过浏览器访问的目录中(根据您的.htaccess设置).Thank@Craig!我不确定我是否理解您为每个文件显示唯一字符串的选择…对于每个文件,您创建一个ID,然后显示此ID而不是路径,为了下载文件,用户使用此ID发出请求,对吗?所以您需要将唯一字符串与文件路径一起存储,对吗?谢谢!好问题:我确实存储了ID(可以是数据库或简单的文本文件).I散列文件的唯一路径,即呈现给用户的唯一id,例如/sample_folder/sample_file.txt使用一些php散列函数(如base64)转换为“jaosidr823ddku”。当请求文件“jaosidr823ddku”时,将搜索unqiue id列表以查找文件的对应路径。抱歉由于延迟,我丢失了这个线程。无论如何,谢谢你的建议!我为每个文件创建了一个唯一的字符串,并在用户名上添加了一个检查…它可能并不完美,但对于我的需要来说应该是相当安全的。谢谢!