【发布时间】:2011-01-14 17:32:41
【问题描述】:
我不得不承认,我从来没有真正完全得到 *nix 文件系统权限模型。哦,rwxrwxrwx 的东西并不太复杂,但是当程序创建新文件以及如何处理它们时,我很容易感到困惑。
我当前的问题是混合了一个(封闭源代码)java-applet,它通过 ftp 和 php 上传文件(它在专用服务器上,数据并不是很关键,所以我不太担心世界可写性)。
所以,我有两个用户:ftp (1000) 和 apache/php (81)。组不匹配,所以他们基本上是“其他人”,如果我是正确的。
一个“导入”目录,设置为 ftp 拥有的 0777。
如果访问者访问上传页面,我的脚本会创建一个以他的用户名命名的子目录。假设访问者用户名是“foo”,所以它是“import/foo”,设置为 0777,用户 81/php。
接下来,访问者使用 java 小程序将文件上传到此目录 (test.jpg)。文件的权限现在是 rw-r--r--,用户 ftp。
第一个问题
我不明白的第一件事是:我可以通过 php 取消链接该文件。
为什么?用户不匹配,并且文件不是世界可写的。
这是因为父目录的世界写入权限吗?可以理解,我无法通过 php 进行 chown 或 chmod。
到目前为止没问题,因为只要我可以阅读和取消链接,一切都好。
第二个问题
java 小程序能够上传整个目录,这很好。如果我这样做,新的子目录 import/foo/test 具有权限 rwxr-xr-x/ftp。该目录下的文件是rw-r--r--/ftp。
现在我不走运了。我不能对这些文件做任何事情(除了阅读,我成功地做到了),没有取消链接,没有 chmod/chowning。他们只是坐在那里吞噬磁盘空间。
那么,新文件的默认权限背后的计划是什么?我的猜测是他们通过 umask 设置了权限,只要创建脚本没有将它们更改为其他内容。我说的对吗?
第三个问题
我能做些什么呢?我的意思是,一个明智的人会怎么做?我可以/我应该更改 ftp 用户的 umask 吗? (我昨天刚刚了解了 umask)。我对此不太满意,因为这会影响所有 ftp 流量,不是吗?另外,服务器是专用的,但我不是管理员,所以我的访问受到限制。
我刚刚有了另一个想法。在开始这篇文章之前,我阅读了基本的 linux 权限内容。首先,在目录链中的任何地方都没有设置粘性位。然后就是:“设置用户 ID 位”。
所以,我目前的计划是使用所有者 ftp 编写一个简单的 shell 脚本,该脚本可以通过 setuid 执行。该脚本只是将导入目录中的文件所有权转移给用户 php。
然后,在每次导入后,我只需 exec() 我的 php 脚本中的那个文件并进一步处理文件。
这行得通吗?更重要的是:这干净合法吗?还是系统管理员会悬赏我?
非常感谢!
更新: 我只是尝试通过 winscp(通过 ftp 连接)设置 uid 位 (4755),但不知何故不起作用 - 它似乎只“忘记”了 uid 位(其他位被设置)。这是为什么?为什么所有者不能自己设置uid?是特定于服务器的还是一般情况?
更新 2:
维基百科说明了一切
由于安全漏洞的可能性增加,许多操作系统在应用于可执行的 shell 脚本时会忽略 setuid 属性。
用户root是否还可以设置uid位?
【问题讨论】:
标签: php linux permissions filesystems