Мне нужно определить, работает ли php как никто. Как мне это сделать?
Есть ли другие имена для "никто"? "Апач"? Любые другие?
Мне нужно определить, работает ли php как никто. Как мне это сделать?
Есть ли другие имена для "никто"? "Апач"? Любые другие?
Если доступно, вы можете исследовать текущую учетную запись пользователя с помощью posix_geteuid
а затем получить имя пользователя с помощью posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Однако, если вы работаете в безопасном режиме (что часто бывает, когда exec отключен), то маловероятно, что ваш PHP-процесс работает под чем угодно, кроме учетной записи www-data
или apache
по умолчанию.
<?php echo exec('whoami'); ?>
Вид обратного пути, но без exec/system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Если вы создадите файл, владелец будет пользователем PHP.
Это также может быть запущено с любой из временных файловых функций, таких как tempnam()
, которая создает случайный файл во временном каталоге и возвращает имя этого файла. Если есть проблемы из-за чего-то вроде разрешений, open_basedir
или безопасного режима, который предотвращает запись файла, как правило, каталог temp все равно будет разрешен.
Более подробная информация была бы полезна, но если предположить, что это Linux-система, и предположим, что php работает под apache, она будет работать так же, как и любой пользовательский apache, выполняемый как.
Простой способ проверить (опять же, предполагая некоторую среду, похожую на unix) - создать php файл с помощью
<?php
print shell_exec( 'whoami' );
?>
который предоставит вам пользователя.
Для моего экземпляра AWS я получаю apache
как вывод, когда я запускаю этот script.
Вы можете попробовать использовать обратные такты:
echo `whoami`;
я использовал бы:
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_
exec('whoami')
сделает это
<?php
exec('whoami');
?>
добавьте файл info.php в следующий каталог - ваш каталог http/apache по умолчанию - обычно /var/www/html
со следующим содержанием
<?php
phpinfo();
?>
Затем перезапуск httpd/apache перейдите в свой html-каталог по умолчанию http://enter.server.here/info.php
предоставит всю родословную php!
В моей настройке я хочу проверить, разрешено ли текущему процессу создавать папки, вложенные папки и файлы, прежде чем начинать процесс, и предложить решение, если оно похоже на то, что я не могу. Я хотел запустить stat(<file>)
для разных целей, чтобы обеспечить соответствие разрешений для выполняемого процесса (я использую php-fpm, поэтому он зависит от пула).
Решение, созданное на основе posix, описанное Марио выше, кажется идеальным, однако кажется, что расширение posix --disabled, поэтому я не мог выполнить вышеописанное, и поскольку я хочу сравнить результаты с ответом от запуска stat(), выполняющего whoami
в отдельная оболочка тоже не полезна (мне нужны uid и gid, а не имя пользователя).
Однако я нашел полезный намек, я мог stat(/proc/self)
и stat(/proc/self/attr)
и видеть uid и gid файла.
Надеюсь, что кто-то еще поможет
Прямо из оболочки можно запустить:
php -r "echo exec('whoami');"
Я обычно использую
<?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()
возвращает владельца "текущего запуска script", поэтому, если вы не "chown" a script на сервере для пользователя веб-сервера, он, скорее всего, быть "никому", или если разработчик-пользователь существует в той же ОС, он скорее отобразит это имя пользователя.
Чтобы обойти это, мы создаем файл с текущим запуском процесса. Если вы просто require()
в текущем запуске script, он будет возвращать то же самое, что и parent-script, как указано; поэтому нам нужно запустить его как отдельный запрос для вступления в силу.
Чтобы сделать это эффективным, подумайте о запуске шаблона проектирования, который включает в себя "режим выполнения", поэтому, когда сервер находится в "режиме разработки или в тестовом режиме", тогда только он может запустить эту функцию и сохранить ее выход где-то в include, или просто текст или базу данных, или в зависимости от того, какой из них.
Конечно, вы можете изменить некоторые особенности кода выше, так как вы хотите сделать его более динамичным, но логика выглядит следующим образом:
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Аутентифицированный пользователь
<?php phpinfo(); ?>
сохранить как info.php и
откройте info.php в вашем браузере
Ctrl + F затем введите любой из них:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
Вы можете видеть пользователя и группа Apache работает как.
Вы можете использовать эти команды:
<? system('whoami');?>
или же
<? passthru('whoami');?>
или же
<? print exec('whoami');?>
или же
<? print shell_exec('whoami');?>
или же
<? print get_current_user();?>