如何检查以什么用户身份运行php?


115

我需要检测php是否以无人身份运行。我该怎么做呢?

“ nobody”还有其他名称吗?“ apache”?还有其他吗?


您对“还有其他名称”这个问题到底是什么意思?系统管理员可以使用他们想要的任何名称创建用户。
阿尔瓦罗·冈萨雷斯

可能被视为服务器的任何其他默认名称;apache,nobody,www-data等
Wesley

1
如果我没记错的话,系统用户通常会有一个小的UID(低于1024?)。无论您要完成什么,这可能都是一个更好的线索。
阿尔瓦罗·冈萨雷斯


9
get_current_user()返回当前脚本的所有者,而不是当前正在运行的用户php。
Dima L.

Answers:


85

如果可用,您可以使用来探测当前用户帐户,posix_geteuid然后使用来获取用户名 posix_getpwuid

$username = posix_getpwuid(posix_geteuid())['name'];

但是,如果您以安全模式运行(通常在禁用exec时会发生这种情况),那么您的PHP进程不太可能在默认值www-dataapache帐户下运行。


10
get_current_user()联机帮助页上一条评论显示了这种方法。从PHP 5.4开始,它可以简化为:print posix_getpwuid(posix_geteuid())['name'];
Palec

209

<?php echo exec('whoami'); ?>


1
不能真正使用exec或system或任何此类passthru函数。
韦斯利

正是我所需要的。get_current_user()绝对不是我所需要的。
dgig

5
对于某些用户可能很有用:如果从命令行界面运行此命令,则将获得运行命令的用户,而不是 PHP用户。
Bram Vanroy

@BramVanroy那么您应该在哪里运行它?= |
安德鲁

@BramVanroy-我想了解您的评论,但我没有。如果您从cli运行该文件,您不是拥有当前php进程的人吗?在这种情况下,除了您之外,PHP用户还会是谁?
billynoah

72

有点落后,但没有exec / system:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

如果创建文件,则所有者将是PHP用户。

这也可能与任何临时文件功能(例如)一起运行,该功能tempnam()会在临时目录中创建一个随机文件并返回该文件的名称。如果由于诸如权限open_basedir或安全模式之类的问题而导致无法写入文件的问题,通常,仍将允许temp目录。


2
非常聪明的跨平台解决方案。h!
马特·弗莱彻

3
尼斯:这里唯一的非特权解决方案也可以找到运行PHP 的
tanius

2
一个值得的黑客,应该得到更高的地位
亚伯拉罕·菲利普

1
@RavinderPayal除非您像我建议的那样使用tempnam函数。几乎可以保证,无论他们是谁,用户都可以写入临时目录。如果无法写入临时目录,则可以临时给文件夹777授予权限,如果启用,请为该路径禁用selinux。
乔纳森·库恩

1
@RavinderPayal还有其他函数可以返回临时路径。因此,$temp_file = tempnam(sys_get_temp_dir(), 'TMP');将在大多数系统上的temp目录中创建一个临时文件。然后,您可以使用该文件来获取用户/组。我把其中的一些留给用户去弄清楚。
乔纳森·库恩

20

更多详细信息将很有用,但是假设它是linux系统,并且假设php在apache下运行,它将以用户apache所运行的状态运行。

一种简单的检查方法(再次假设环境是unix)是使用以下方法创建一个php文件:

<?php
    print shell_exec( 'whoami' );
?>

这将给您用户。

对于我的AWS实例,apache运行此脚本时得到的是输出。


16

您可以尝试使用反引号,如下所示:

echo `whoami`;

7
这只是上面问题的重复。
volter9

2
对于某些用户可能很有用:如果从命令行界面运行此命令,则将获得运行命令的用户,而不是 PHP用户。
Bram Vanroy

12

我会用:

lsof -i
lsof -i | less
lsof -i | grep :http

这些中的任何一个。您可以在ssh命令行中键入em,然后您将看到什么用户正在监听什么服务。

您也可以检查以下文件:

more /etc/apache2/envvars

并查找以下行:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

要过滤掉envvars文件数据,可以使用grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvars很好,谢谢。
塔里克

11

exec('whoami') 将做到这一点

<?php
echo exec('whoami');
?>

不能真正使用exec或system或任何此类passthru函数。
韦斯利

@韦斯利:所以那不可能。
起源

2
对于某些用户可能很有用:如果从命令行界面运行此命令,则将获得运行命令的用户,而不是 PHP用户。
Bram Vanroy


1

将文件info.php添加到以下目录-您的默认http / apache目录-通常为/ var / www / html

具有以下内容

<?php                                                                           
phpinfo();                                                                    
?>  

然后httpd / apache重新启动转到默认的html目录 http://enter.server.here/info.php

将提供整个php谱系!


3
我们要在输出中寻找哪个变量/值?
安德鲁

我确定您已经找到了这个,但是在该页面上搜索“用户”?
CRTLBREAK

0

在我的设置中,我想检查当前进程是否有权在开始进程之前创建文件夹,子文件夹和文件,并提出解决方案(如果看起来无法解决)。我想stat(<file>)在各种事物上运行以确保权限与正在运行的进程的权限匹配(我使用的是php-fpm,因此它取决于池)。
Mario上面给出的基于posix的解决方案似乎是完美的,但是posix扩展名似乎已被禁用,因此我无法执行上述操作,并且我想将结果与运行whoami在单独shell中的stat()的响应进行比较也没有帮助(我需要uid和gid而不是用户名)。

不过,我发现了一个有用的提示,我可以stat(/proc/self)stat(/proc/self/attr)看到的UID和GID的文件。

希望对别人有帮助


0

您可以使用以下命令:

<? system('whoami');?>

要么

<? passthru('whoami');?>

要么

<? print exec('whoami');?>

要么

<? print shell_exec('whoami');?>

要么

<? print get_current_user();?>

get_current_user()并没有返回当前用户。它返回调用该函数的脚本的所有者
。– andsens

-1

我通常使用

<?php echo get_current_user(); ?>

如果能帮到您,我会很高兴


这个问题的注释中已经提到了这一点,它与运行脚本的用户关系不大。
Palec

get_current_user() - Gets the name of the owner of the current PHP script- 不是运行PHP进程的用户。
弗朗西斯科·扎拉波佐

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];可以,但是在SSH中提供当前登录的用户名。
塔里克

-1

提案

有点迟了,但是即使以下方法可以解决,它也可以解决要求,因为它可以正常工作:

<?
    function get_sys_usr()
    {
        $unique_name = uniqid();  // not-so-unique id
        $native_path = "./temp/$unique_name.php";
        $public_path = "http://example.com/temp/$unique_name.php";
        $php_content = "<? echo get_current_user(); ?>";
        $process_usr = "apache";  // fall-back

        if (is_readable("./temp") && is_writable("./temp"))
        {
            file_put_contents($native_path,$php_content);
            $process_usr = trim(file_get_contents($public_path));
            unlink($native_path);
        }

        return $process_usr;
    }


    echo get_sys_usr();  // www-data
?>


描述

上面的代码突出显示不正确,请复制并粘贴到您喜欢的编辑器中,然后以PHP代码查看,或者您自己保存并对其进行测试。

如您所知, get_current_user()返回“当前正在运行的脚本”的所有者-因此,如果您没有将“服务器上的脚本”“扔给” Web服务器用户,则它很可能是“没人”,或者如果开发者-用户位于同一操作系统上,它将显示该用户名。

要解决此问题,我们使用当前运行的进程创建一个文件。如果只是将require()其放入当前正在运行的脚本中,它将返回与上述父脚本相同的内容;因此,我们需要将其作为单独的请求运行才能生效。

工艺流程

为了使此功能有效,请考虑运行包含“运行时模式”的设计模式,因此,当服务器处于“开发模式或测试模式”时,则只有服务器才能运行此功能并将其输出保存在包含项中,-或纯文本或数据库,或任何一个。

当然,您可以更改上面代码的某些细节,以使其更具动态性,但是逻辑如下:

  • 定义唯一的引用以限制对其他用户的干扰
  • 定义用于写入临时文件的本地文件路径
  • 定义一个公共URL /路径以在其自己的进程中运行此文件
  • 编写输出脚本所有者名称的临时php文件
  • 通过向其发出请求来获取此脚本的输出
  • 删除不再需要的文件-如果需要,请保留该文件
  • 返回请求的输出作为函数的返回值

-1
<?php phpinfo(); ?>

另存为info.php和

在浏览器中打开info.php

ctrl + f,然后输入以下任意一项:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

您可以看到用户和组apache的运行方式。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.