【发布时间】:2023-03-14 23:59:01
【问题描述】:
如何检查脚本是否使用 sudo 访问或不使用 PHP 运行?
【问题讨论】:
标签: permissions php
如何检查脚本是否使用 sudo 访问或不使用 PHP 运行?
【问题讨论】:
标签: permissions php
注意:这个问题在 Stack Overflow 上可能更合适,即使它指的是 Unix 和 Linux 系统上的 PHP(权限提升、权限等)。
您可以使用 PHP 的 POSIX 函数:
这是一个小例子:
<?php
$userinfo = posix_getpwuid(posix_geteuid());
echo "This script runs with " . $userinfo["name"] . "'s privileges.";
?>
测试...
$ php myfile.php
This script is run with myuser's privileges.
$ sudo php myfile.php
This script is run with root's privileges.
顺便说一句,由于 root 总是 UID 0,你可以检查 posix_geteuid() == 0。
现在,如果您想知道用户是使用 CLI(命令行)还是通过 Web 服务器,请查看 this question on Stack Overflow 和 php_sapi_name() 函数。
另一个注意事项:我很确定以 root 身份运行 PHP 脚本并不是最好的主意。您可能需要重新考虑一下您的脚本真正需要哪些权限。
【讨论】:
sudo 运行脚本都不会改变任何事情,您仍然设置 EUID 0。这里有一个更明显的示例:如果唯一的事情你的脚本不能做的是“写在/path/a”,那么你不应该仅仅为此授予它完全的root访问权限。相反,您应该尝试调整您的文件系统权限,并在最后的手段中设置更具体的sudo 策略。 Here is a little something you might find interesting.
如果纯粹是为了判断是否使用sudo,sudo会在命令的环境中放入多个值:
SUDO_COMMAND=/usr/bin/commandname
SUDO_USER=wurtel
SUDO_UID=1000
SUDO_GID=1001
这些可以在 php 中使用getenv() 函数进行检查。当然,将它与 posix_geteuid() 函数结合使用,以确保您确实拥有提升的权限,因为任何人都可以在环境中设置这些值。
【讨论】:
它必须只在 php 中吗?您可以将 php 目录 chmod 为只能由 root 执行,这应该会为您实现相同的结果。
chmod 700 filename
chmod 700 foldername -R
-R
-R 表示递归,因此任何文件或子文件夹都将获得与父文件夹相同的权限。请谨慎使用。
为了进一步改善这一点,您可以创建一个可以拥有文件的“phpadmin”用户,这样除了 root 和 phpadmin 之外没有其他用户可以执行它们。
useradd phpadmin
chown phpadmin:phpadmin foldername -R
警告
使用 chmod & chown 命令时请务必小心。确保在使用这些命令之前定位正确的文件夹和文件名。
【讨论】: