我是网络服务器领域的新手,所以请耐心等待。
我正在尝试使用 Ubuntu、Nginx 和 Lumen 为移动应用程序构建自己的 API。
一切都很顺利,直到我将图像从移动应用程序上传到我的网络服务器并将 URL 保存在mysql
数据库后端。
假设我的项目文件夹已命名TestProject
,并且我想将图像保存在 下Testproject/public/Images/user_id/img.png
。
我应该使用什么权限才能使只有 Web 服务器能够写入文件夹和图像,而其他人只能通过 URL 请求读取图像?
更新澄清:
我主要担心的是安全性(我不希望任何人删除、添加或执行我服务器上的文件),因此更清楚的是,我的情况如下:
- 移动应用程序用户发送图片和用户身份(用作子文件夹名称)通过 http/https post 请求。
- 在服务器端,PHP-Lumen 代码将接收图像并将其保存在
Testproject/public/Images/user_id/img.png
(正如我之前提到的,此步骤只能由 Web 服务器用户完成);现在我只有root),然后将图像的URL保存到MySQL数据库中。 - 所有移动应用程序用户都可以通过 url 读取所有图像(在移动应用程序中,读取意味着通过 http/https 请求下载)。
我建议的解决方案:
创建一个新的超级用户并使其成为所有项目文件夹的所有者,并授予其读写文件夹和文件的权限(我不知道该怎么做)并授予世界仅读取文件夹内所有文件的权限/images
(我也不知道如何做)。
答案1
据我所知(几乎不可能确定你真正想要解决/实现什么——如果有的话,那可能是一个XY问题(在这种情况下),您尝试做的是让 Web 服务器可以读取/写入文件夹和文件,但您为客户端提供的“端点”只能读取数据。如果不使用两个完全独立的、具有完全不同权限集的 Web 服务器,您就无法同时实现这两种方式。正如另一个答案中所说,这并不能保护您的主读/写 Web 服务器免受攻击。
根据我的理解,您似乎想要的是仅让 Web 服务器和相应的后端处理对文件的访问,并为终端客户端提供实际加载的 URL(用于图像等)。这不过是基本的我在另一个答案中提到过的网络服务器权限。我在评论中链接了它(以及在这个答案的末尾)。
这是获取基本的为此,请检查 web 服务器文件系统权限结构。您不需要做太多事情。如果您需要,则取决于您如何编写后端来处理权限,这超出了此处可回答的范围。
步骤 1:将项目目录放在 Web 服务器可访问的位置,例如/var/www/
站点名称下的文件夹。
sudo mkdir /var/www/PROJECTDIR
第 2 步:将所有项目文件放入其中(以用户root
开始)。
步骤 3:将新目录的目录结构所有权更改www-data:www-data
为 Web 服务器。
sudo chown -R www-data:www-data /var/www/PROJECTDIR
步骤 4:授予www-data
用户/组对项目目录内所有目录的读/写/执行权限,以及对所有文件的读/写权限。
sudo find /var/www/PROJECTDIR -type d -exec chmod 770 {} \;
sudo find /var/www/PROJECTDIR -type f -exec chmod 660 {} \;
第 5 步:您已完成。
您似乎不需要系统本身上的任何其他用户帐户(非 root 用户、其他系统用户等)即可看到此处子目录中的任何内容,因此上述操作将实现这一点。
你似乎也不需要任何特别的权限,因为这取决于您编写的后端是否正确处理给定请求是否应依次返回系统上给定图像的给定 URL。如果它没有这种类型的权限处理,那就是您个人后端的问题,而不是 NGINX 问题,也不是系统文件权限问题。
但请注意,正如我上面所说,这是来自其他答案基本上做同样的事情。
答案2
这两个要求表面上是矛盾的:
我应该使用什么权限才能使只有 Web 服务器能够写入文件夹和图像,而其他人只能通过 URL 请求读取图像?
Web 服务器进程负责接收、组织和存储新图像,以及随后的检索。它需求写权限来执行第一项任务。解决该问题的唯一方法是运行具有不同权限的单独 Web 服务器进行存储和检索,但我不确定你希望通过这种方式获得什么:攻击者仍然可以攻击具有写权限的图像上传服务器。