【问题标题】:PHP file upload permissionsPHP文件上传权限
【发布时间】:2013-02-05 12:25:46
【问题描述】:

我正在设置共享主机。我的用户可以通过 SFTP 访问服务器来上传他们的内容。我正在使用单独的 PHP 进程作为各自的用户运行(每个站点一个)。我希望用户默认看不到其他用户的内容(除了通过网络服务器作为任何其他非特权客户端),但网络服务器(作为 www-data 用户/组运行)应该能够读取所有内容。现在,我将 www 中文件的所有权授予特定用户,将组所有权授予 www-data,并使用 set GID 位将组所有权传播到新文件/目录(用户不在 www-data 组中)。

它工作得很好,但现在我遇到了一个问题。一些网站正在使用 wordpress,当他们上传文件时,设置的 GID 位会丢失,这意味着 Web 服务器无法访问它。是否有某种方法可以将 PHP 或 wordpress(更有可能)配置为 chmod 文件和目录到正确的权限?

注意:我在 PHP 中没有使用安全模式,所以应该可以添加设置的 GID 位。

更新:我尝试在 wordpress 配置中调整 FS_CHMOD_DIRFS_CHMOD_FILE 值。我认为这将允许我将上传的文件更改为我想要的任何内容。但是,它并不影响新上传文件的权限。从codex 中的信息来看,我猜这些设置仅适用于核心更新功能。

谢谢!

【问题讨论】:

  • 您可以使用 .htaccess 和 .htpasswd 来保护每个用户的目录为每个站点创建虚拟目录。
  • 问题是我想让用户通过 SFTP 访问,所以他们可以访问 HTTP 服务器之外的文件。 htaccess 和 htpasswd 在这种情况下无济于事。
  • 为什么要谈论 php 和 www-data? SFTP 是一种文件传输协议。您可以为用户或 sftp 组用户创建目录并设置文件系统权限。
  • SFTP 用于将文件传输到服务器。然后 HTTP 服务器必须显示它们,这就是 PHP 的用武之地。我正在使用以这些用户身份运行的 PHP-FPM 实例,而 Web 服务器必须提供静态内容。这是否使它更清楚一点?
  • 你可以设置访问用户对SFTP目录的权限,对吧?你说,php可以访问任何目录下的文件,怎么限制呢?每个人都使用虚拟目录来解决这个问题。一个用户,服务器中的一个文档根目录。但是您可以将服务器空间目录创建到用户主目录中,并为此创建链接到服务器以访问 Web 服务器以访问用户数据。

标签: php wordpress permissions chmod


【解决方案1】:

这不是确切问题的答案,而是一般问题的解决方案。将用户的 web 目录的所有权分配给 user/www-data 并将权限设置为 750,无 SGID 位。用户必须属于 www-data 组。但是,在该目录中,可以将组所有权设置为用户的主组(例如用户)。里面的权限可以分别是文件和子目录的644和755。其他用户将无法进入或遍历此 Web 目录,因此即使他们有足够的权限自行访问文件,也无法访问其中的任何文件,从而提供了安全性。这将限制通过 SFTP 连接和执行 PHP 命令的用户。

由于此解决方案不使用设置 GID 位,因此它解决了原始问题。上传的文件可以保留其默认所有权和权限。

一个小示范:

transistor# mkdir www
transistor# chown :www-data www
transistor# chmod 750 www
transistor# ls -l
total 4
drwxr-x--- 2 root www-data 4096 Feb 20 20:59 www
transistor# touch www/file1.txt
transistor# mkdir www/subdir
transistor# touch www/subdir/file2.txt
transistor# ls -l www
total 4
-rw-r--r-- 1 root root    0 Feb 20 21:00 file1.txt
drwxr-xr-x 2 root root 4096 Feb 20 21:00 subdir
transistor# ls -l www/subdir 
total 0
-rw-r--r-- 1 root root 0 Feb 20 21:00 file2.txt
transistor# exit
giedrius@transistor:/tmp/sandbox$ cd www
bash: cd: www: Permission denied
giedrius@transistor:/tmp/sandbox$ ls www/subdir
ls: cannot access www/subdir: Permission denied
giedrius@transistor:/tmp/sandbox$ cat www/file1.txt
cat: www/file1.txt: Permission denied
giedrius@transistor:/tmp/sandbox$ cat www/subdir/file2.txt
cat: www/subdir/file2.txt: Permission denied
giedrius@transistor:/tmp/sandbox$ sudo -su www-data
transistor% ls www 
file1.txt  subdir
transistor% cat www/file1.txt 
transistor% cat www/subdir/file2.txt 
transistor% 

【讨论】:

  • 谢谢它帮了我很多。一个简单的 chmod 750 比 setgid 简单。
猜你喜欢
  • 2012-10-21
  • 2017-01-19
  • 2015-10-15
  • 2011-04-08
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多