我需要检测 php 是否作为无人运行?
“无名小卒”还有别的名字吗? “阿帕奇”? 还有别的吗?
<?php echo exec('whoami'); ?>
exec('whoami') 将这样做
exec('whoami')
你可以试试这样使用反勾:
echo `whoami`;
如果可用,您可以使用 posix_geteuid探测当前用户帐户,然后使用 posix_getpwuid获取用户名。
posix_geteuid
posix_getpwuid
$username = posix_getpwuid(posix_geteuid())['name'];
但是,如果您在安全模式下运行(禁用 exec 时通常是这种情况) ,那么您的 PHP 进程不太可能在默认的 www-data或 apache帐户以外的任何情况下运行。
www-data
apache
有点落后,但没有 exec/system:
file_put_contents("testFile", "test"); $user = fileowner("testFile"); unlink("testFile");
如果您创建一个文件,其所有者将是 PHP 用户。
这也可以与任何临时文件函数一起运行,比如 tempnam(),它在临时目录中创建一个随机文件并返回该文件的名称。如果由于权限、 open_basedir或安全模式等原因导致无法写入文件,通常情况下,临时目录仍然是允许的。
tempnam()
open_basedir
更多的细节将是有用的,但是假设它是一个 linux 系统,并且假设 php 在 apache 下运行,它将以任何用户 apache 的运行方式运行。
一种简单的检查方法(同样,假设有一些类似 unix 的环境)是创建一个 php 文件:
<?php print shell_exec( 'whoami' ); ?>
它会给你用户。
对于我的 AWS 实例,当我运行这个脚本时,我将获得 apache作为输出。
我会用:
lsof -i
lsof -i | less
lsof -i | grep :http
您可以在 ssh 命令行中键入其中的任何一个,您将看到哪个用户正在监听每个服务。
您也可以检查这个文件:
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_
在我的设置中,我想检查当前进程是否有权创建文件夹、子文件夹和文件,然后再开始进程,如果看起来我不能,我会建议一个解决方案。我希望在各种事情上运行 stat(<file>),以确保权限与正在运行的进程的权限相匹配(我使用的是 php-fpm,因此它取决于池)。 Mario 上面给出的基于 posx 的解决方案看起来很完美,但是似乎 posx 扩展被禁用了,所以我不能做上面的工作,因为我想将结果与在单独的 shell 中运行 stat ()运行 whoami的响应进行比较,这也没有帮助(我需要 uid 和 gid,而不是用户名)。
stat(<file>)
whoami
但是我发现了一个有用的提示,我可以看到 stat(/proc/self)和 stat(/proc/self/attr)文件的 uid 和 gid。
stat(/proc/self)
stat(/proc/self/attr)
希望能帮到别人
我经常用
<?php echo get_current_user(); ?>
如果能帮到你,我会很高兴的
$_SERVER["USER"] $_SERVER["USERNAME"]
虽然有点晚,但是尽管下面是一个解决方案,它还是解决了这个需求,因为这个方案工作得很好:
<? 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()返回“当前运行脚本”的所有者——所以如果你没有“咀嚼”服务器上的脚本给网络服务器用户,它很可能是“无名小卒”,或者如果开发者用户存在于同一个操作系统上,它宁愿显示那个用户名。
get_current_user()
为了解决这个问题,我们使用当前正在运行的进程创建一个文件。如果您只是将其 require()到当前运行的脚本中,它将返回与前面提到的父脚本相同的内容; 因此,我们需要将其作为单独的请求运行才能生效。
require()
为了使其有效,可以考虑运行一个包含“运行时模式”的设计模式,这样当服务器处于“开发模式或测试模式”时,只有它可以运行这个函数并将其输出保存在 include 中的某个地方,或者只保存纯文本或数据库,或者其他任何地方。
当然,您可以更改上述代码的一些细节,以使其更具有动态性,但其逻辑如下:
将文件 info.php 添加到以下目录-默认的 http/apache 目录-Normal/var/www/html
内容如下
<?php phpinfo(); ?>
然后重新启动 httpd/apache 转到默认的 html 目录 Http://enter.server.here/info.php
将带来整个 php 的血统!
$user = $_SERVER['REMOTE_USER'];
Http://php.net/manual/en/reserved.variables.server.php
身份验证用户
保存为 info.php 和
在浏览器中打开 info.php
Ctrl + f 然后键入以下任何一个:
APACHE_RUN_USER APACHE_RUN_GROUP user/group
您可以看到用户和组 apache 的运行方式是。
你可以直接从外壳运行:
php -r "echo exec('whoami');"
您可以使用以下命令:
<? system('whoami');?>
或者
<? passthru('whoami');?>
<? print exec('whoami');?>
<? print shell_exec('whoami');?>
请注意,get_current_user()返回当前 PHP 脚本所有者的名称!