Как проверить, от имени какого пользователя работает php?

116

Мне нужно определить, работает ли php как никто. Как мне это сделать?

Есть ли еще какие-нибудь имена для «никого»? "апач"? Любые другие?

Wesley
источник
Что именно вы имеете в виду под вопросом «есть ли еще имена»? Системные администраторы могут создавать пользователей с любым именем.
Альваро Гонсалес,
Любые другие имена по умолчанию для всего, что может считаться сервером; apache, никто, www-data и т. д.
Уэсли,
1
Если я правильно помню, у системных пользователей обычно маленький UID (ниже 1024?). Это может быть лучшим ключом к разгадке того, чего вы пытаетесь достичь.
Альваро Гонсалес,
9
get_current_user () возвращает владельца текущего скрипта, а не текущего пользователя php.
Дима Л.

Ответы:

85

Если доступно, вы можете проверить текущую учетную запись пользователя, posix_geteuidа затем получить имя пользователя с помощью posix_getpwuid.

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

Однако если вы работаете в безопасном режиме (что часто бывает, когда exec отключен), то маловероятно, что ваш процесс PHP работает под чем-либо, кроме учетной записи по умолчанию www-dataили apacheучетной записи.

марио
источник
10
Есть комментарий к get_current_user()странице руководства, который показывает этот подход. Начиная с PHP 5.4, его можно сократить до следующего:print posix_getpwuid(posix_geteuid())['name'];
Palec
212

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

AlienWebguy
источник
1
Не могу использовать exec или system или любые подобные функции passthru.
Уэсли,
Было именно то, что мне было нужно. get_current_user () - это не то, что мне определенно нужно.
dgig
5
Может быть полезно для некоторых пользователей: если вы запустите это из интерфейса командной строки, вы получите пользователя, выполняющего команду, а не пользователя PHP.
Брэм Ванрой
@BramVanroy тогда где его запустить? = |
Эндрю
@BramVanroy - Я хочу понять ваш комментарий, но не понимаю. если вы запустите это из cli, разве вы не владеете текущим процессом php? Кем, кроме вас, в этом случае будет пользователь PHP?
billynoah 07
72

Вид обратного пути, но без exec / system:

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

Если вы создаете файл, владельцем будет пользователь PHP.

Это также может быть запущено с любой из функций временного файла, например tempnam(), которая создает случайный файл во временном каталоге и возвращает имя этого файла. Если есть проблемы из-за чего-то вроде разрешений open_basedirили безопасного режима, которые предотвращают запись файла, обычно временный каталог все равно будет разрешен.

Джонатан Кун
источник
2
Очень умное кроссплатформенное решение. Бох!
Мэтт Флетчер
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`;
ricbra
источник
7
Это просто дубликат вопросов выше.
volter9
2
Может быть полезно для некоторых пользователей: если вы запустите это из интерфейса командной строки, вы получите пользователя, выполняющего команду, а не пользователя PHP.
Брэм Ванрой
13

я хотел бы использовать:

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

любой из этих. Вы можете ввести em в свою командную строку 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_
Лукас Лисис
источник
1
grep "APACHE_RUN_" /etc/apache2/envvarsработал хорошо, спасибо.
Tarik
11

exec('whoami') сделаю это

<?php
echo exec('whoami');
?>
генезис
источник
Не могу использовать exec или system или любые подобные функции passthru.
Уэсли,
@ Уэсли: так что это невозможно.
генезис
2
Может быть полезно для некоторых пользователей: если вы запустите это из интерфейса командной строки, вы получите пользователя, выполняющего команду, а не пользователя PHP.
Брэм Ванрой
5

Прямо из оболочки можно запустить:

php -r "echo exec('whoami');"
Габриэль Вилчес Алвес
источник
1

добавьте файл info.php в следующий каталог - ваш каталог http / apache по умолчанию - обычно / var / www / html

со следующим содержанием

<?php                                                                           
phpinfo();                                                                    
?>  

Затем httpd / apache перезапустите, перейдите в свой html-каталог по умолчанию http://enter.server.here/info.php

доставит всю родословную php!

CRTLBREAK
источник
3
и какую переменную / значение в этом выводе мы ищем?
Эндрю
Я уверен, что вы уже нашли это, но ищете ли вы "пользователь" на этой странице?
CRTLBREAK
0

В своих настройках я хочу проверить, есть ли у текущего процесса разрешение на создание папок, подпапок и файлов, прежде чем я начну процесс, и предложить решение, если похоже, что я не могу. Я хотел запускать stat(<file>)разные вещи, чтобы убедиться, что разрешения совпадают с разрешениями запущенного процесса (я использую php-fpm, поэтому он зависит от пула).
Решение на основе posix, которое Марио дал выше, кажется идеальным, однако кажется, что расширение posix --disabled, поэтому я не мог сделать это, и поскольку я хочу сравнить результаты с ответом от запуска stat () runningwhoami в отдельной оболочке тоже не помогает (мне нужны 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(); ?>

Буду рад если тебе помогло

yiimar
источник
Об этом уже упоминалось в комментариях под вопросом, и это имеет очень мало общего с пользователем, под которым работает скрипт.
Palec 03
get_current_user() - Gets the name of the owner of the current PHP script- не пользователь, запускающий процесс PHP.
Франсиско Зарабозо,
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
шаг
источник
echo $_SERVER["USER"];работает, но дает имя текущего зарегистрированного пользователя в SSH.
Tarik
-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()возвращает владельца «текущего запущенного скрипта» - так что, если вы не «показали» скрипт на сервере пользователю веб-сервера, он, скорее всего, будет «никто», или, если разработчик- Пользователь существует в той же ОС, он скорее отобразит это имя пользователя.

Чтобы обойти это, мы создаем файл с текущим запущенным процессом. Если ты простоrequire() это в текущий запущенный скрипт, он вернет то же самое, что и родительский скрипт, как упоминалось; поэтому нам нужно запустить его как отдельный запрос, чтобы он вступил в силу.

Процесс-поток

Чтобы сделать это эффективным, рассмотрите возможность запуска шаблона проектирования, который включает в себя «режим выполнения», поэтому, когда сервер находится в «режиме разработки или тестовом режиме», только он может запустить эту функцию и сохранить ее вывод где-нибудь во включаемом , -или просто текст или базу данных, или что-то еще.

Конечно, вы можете изменить некоторые детали приведенного выше кода, если хотите сделать его более динамичным, но логика следующая:

  • определить уникальную ссылку, чтобы ограничить помехи другим пользователям
  • определить локальный путь к файлу для записи временного файла
  • определить общедоступный URL / путь для запуска этого файла в его собственном процессе
  • напишите временный файл php, который выводит имя владельца скрипта
  • получить вывод этого скрипта, сделав к нему запрос
  • удалите файл, поскольку он больше не нужен - или оставьте его, если хотите
  • вернуть вывод запроса как возвращаемое значение функции

источник
-1
<?php phpinfo(); ?>

сохранить как info.php и

откройте info.php в вашем браузере

ctrl + f, затем введите любой из них:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

вы можете видеть пользователя и группу apache, запущенную как.

Джером младший Форментера
источник