【发布时间】:2011-09-19 22:45:56
【问题描述】:
好的,不确定我在这里缺少什么。我正在尝试使用 Web 可访问的 PHP 脚本重命名一些文件,但不授予对这些文件的世界写入权限。所以我尝试在 PHP 脚本上使用 SUID(也尝试了 shell 脚本)。
其中有三个用户,我们称他们为 APACHE、MATT 和 BRIAN。 还有一个叫WEBDEV的组,MATT和BRIAN都在里面。 有两个文件需要重命名。一个由 MATT 所有,另一个由 BRIAN 所有。两个文件组的所有者都是 WEBDEV。
-rw-rw-r-- 1 MATT WEBDEV 126179 Jun 20 12:03 g5g55.jpg
-rw-rw-r-- 1 BRIAN WEBDEV 41588 Jul 14 2006 g2g22.jpg
所以我要在浏览器中访问的 PHP 脚本称为 rename.php,以 APACHE 运行。它不能重命名这些文件中的任何一个。自然。所以我尝试的第一件事就是将 PHP 脚本 SUID 为 MATT。
su MATT
chmod u+s /path/to/rename.php //also tried g+s
正如我所料,没有骰子。所以我写了第二个脚本,叫做 move.php。
#!/usr/bin/php
//code to move file
然后 SUID 那个脚本。
su MATT
chmod u+s /path/to/move.php //also tried g+s
然后从原来的web访问脚本rename.php,我调用:
shell_exec('/path/to/move.php');
我对这个抱有更高的期望,再也没有骰子了。所以我认为由于 PHP 解释器或 Apache 再次无法正常工作。现在我尝试同样的事情,但是从 rename.php 中执行了一个名为 move.sh 的新 shell 脚本。
#!/bin/bash
//code to move file
再一次,它不起作用。如果我从 shell 执行文件 move.php 或 move.sh 作为 MATT,它工作正常。不知道为什么这不起作用,或者我如何使它与 SUID 一起工作,而不是使用 sudo 或设置某种可以从适当特权用户的 cron 调用的 que。处理这个问题的最佳方法是什么?提前致谢。
更新
为以后偶然发现此问题的任何人弄清楚。 SUID 不适用于我的发行版(或大多数情况下)上的 shell 脚本。从 shell 脚本调用的任何后续命令都将以启动它的原始用户身份运行,而不是以设置 SUID 位的用户身份运行。这也适用于 PHP 和您进行的任何 exec 调用,您必须在 /usr/bin/php 上设置 SUID 位,这显然是一个非常糟糕的主意。或者,您可以使用系统调用将您的 shell 脚本包装在 C 二进制文件中。我将使用 SUDO。
相关信息: https://serverfault.com/questions/282835/apache-mod-php-ignores-suid
【问题讨论】:
-
这与 PHP 解释器无关。 PHP 仅以用户身份访问文件,并且它是操作系统赋予 PHP 的权利。检查您的服务器配置,了解 SUID 和权限如何工作,然后再尝试三遍,只更改名称。检查脚本实际在哪个用户下执行,然后相应地反映文件权限:
echo shell_exec('whoami');。 -
@hakre 不同之处不仅在于重命名文件。它们都被不同地调用。尽管这一切都源于 apache + mod_php 这很可能是问题所在。 whoami 报告用户运行脚本,而不管设置了 SUID 位。我不想只允许 apache 写入这些文件,我希望这是受控的,并且只有在强制执行非常具体的参数时才可行。
标签: php apache exec file-permissions