【问题标题】:php & filesystem +setUID/permissions ... i just don't get it!php & filesystem +setUID/permissions ...我就是不明白!
【发布时间】: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


【解决方案1】:

第一个答案

正确,您有权修改目录,以便取消链接文件。该文件对您来说是可读还是可写是无关紧要的。

第二个答案

是的,除非脚本/小程序将文件权限更改为其他内容,否则将使用用户的默认 umask 是正确的

第三个答案

为 ftp 设置默认 umask 是最简单的解决方案,但正如您所说,这会影响 ftp 用户创建的所有文件。如果该用户仅用于通过小程序进行上传(应该确实如此),那么我想说这不是一个真正的问题。

另一种选择是运行一个 cron 作业,该作业执行脚本(如您所建议的那样),从 FTP 上传区域到 webroot 上的某个地方对文件进行 chmoding/拥有文件(可能还有病毒扫描等)。

您没有说明为什么将这些文件只读给 Apache 是一个问题(或者是 FTP 根目录不在 Web 根目录下的事实?),也许澄清这将有助于指出一个明智的解决方案?一般来说,除非您事先审查过,否则您不会相信用户给您的任何东西。

编辑 - 刚刚看到你不是这台机器的管理员,这让事情变得困难。

【讨论】:

  • 问题不是读取(可能)/写入,而是通过apache/php删除上传子目录中的文件和子目录不起作用。由于历史原因,ftp 根目录位于 web 根目录下,但这不是问题 - 文件不是从那里提供的,只是调整大小。安全性不是一个大问题,因为上传只接受图像文件,并且对它们进行的唯一操作是在删除之前调整大小并将它们复制到其他地方。即使用户设法将其他东西放在那里,它也在身份验证之后。另外,用户是我创建的(无需自行注册)。
  • 澄清:我需要的操作是通过子目录(由 ftp 用户创建)中的 php 读取(有效)和删除(无效)。使用此工具的访问者 对黑客自己没有兴趣的客户。恕我直言,cronjob 不是一个好主意,因为用户必须等到工作。用作目标目录的每次上传 uid 都可以,因为在成功导入后,导入可能会被标记为要删除的 cronjob,但这对我来说似乎是一种粗略的解决方法。
【解决方案2】:

我今天学到的东西:setuid 位经常被脚本停用。

我已经确定的解决方案:apache/php 为 某些脚本(所有脚本在 webroot 之外的一个目录中)获得 sudoer-rights,这些脚本可以作为 ftp 用户或 apache 用户运行.然后我可以使用 system/exec/etc 的 php 中的 sudo 调用这些脚本。

我不知道 sudo 可以这样配置。 惊人的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多