J'ai besoin de détecter si PHP fonctionne en tant que personne. Comment puis-je faire cela?
Y a-t-il d'autres noms pour «personne»? "apache"? D'autres?
J'ai besoin de détecter si PHP fonctionne en tant que personne. Comment puis-je faire cela?
Y a-t-il d'autres noms pour «personne»? "apache"? D'autres?
Réponses:
Si disponible, vous pouvez rechercher le compte d'utilisateur actuel avec posix_geteuid
, puis obtenir le nom d'utilisateur avec posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Cependant, si vous exécutez en mode sans échec (ce qui est souvent le cas lorsque exec est désactivé), il est peu probable que votre processus PHP s'exécute sous autre chose que le compte par défaut www-data
ou le apache
compte.
get_current_user()
page de manuel qui montre cette approche. À partir de PHP 5.4, il peut être raccourci à ceci:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Un peu en arrière, mais sans exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Si vous créez un fichier, le propriétaire sera l'utilisateur PHP.
Cela pourrait également être exécuté avec l'une des fonctions de fichier temporaire telles que tempnam()
, qui crée un fichier aléatoire dans le répertoire temporaire et renvoie le nom de ce fichier. S'il y a des problèmes dus à quelque chose comme les autorisations open_basedir
ou le mode sans échec qui empêchent l'écriture d'un fichier, généralement, le répertoire temporaire sera toujours autorisé.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
créerait un fichier temporaire dans le répertoire temporaire sur la plupart des systèmes. Vous pouvez ensuite utiliser ce fichier pour obtenir l'utilisateur / le groupe. J'ai laissé une partie de cela à l'utilisateur pour comprendre.
Plus de détails seraient utiles, mais en supposant qu'il s'agisse d'un système Linux, et en supposant que php fonctionne sous apache, il fonctionnera comme tout utilisateur apache.
Un moyen simple de vérifier (encore une fois, en supposant un environnement de type Unix) est de créer un fichier php avec:
<?php
print shell_exec( 'whoami' );
?>
qui vous donnera l'utilisateur.
Pour mon instance AWS, j'obtiens une apache
sortie lorsque j'exécute ce script.
Vous pouvez essayer d'utiliser des backticks comme ceci:
echo `whoami`;
j'utiliserais:
lsof -i
lsof -i | less
lsof -i | grep :http
aucun de ceux-ci. Vous pouvez taper em dans votre ligne de commande ssh et vous verrez quel utilisateur écoute quel service.
vous pouvez également aller vérifier ce fichier:
more /etc/apache2/envvars
et recherchez ces lignes:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
pour filtrer les données des fichiers envvars, vous pouvez utiliser grep:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
a bien fonctionné, merci.
exec('whoami')
fera ça
<?php
echo exec('whoami');
?>
Directement depuis le shell, vous pouvez exécuter:
php -r "echo exec('whoami');"
ajoutez le fichier info.php dans le répertoire suivant - votre répertoire http / apache par défaut - normalement / var / www / html
avec le contenu suivant
<?php
phpinfo();
?>
Puis httpd / apache redémarrez et accédez à votre répertoire html par défaut http://enter.server.here/info.php
livrerait tout le pedigree php!
Dans ma configuration, je veux vérifier si le processus actuel a l'autorisation de créer des dossiers, des sous-dossiers et des fichiers avant de commencer un processus et suggérer une solution si cela semble impossible. Je voulais exécuter stat(<file>)
diverses choses pour m'assurer que les autorisations correspondent à celles du processus en cours (j'utilise php-fpm donc cela varie en fonction du pool).
La solution basée sur posix que Mario a donnée ci-dessus semble parfaite, mais il semble que l'extension posix soit --disabled, donc je ne pouvais pas faire ce qui précède et comme je veux comparer les résultats avec la réponse de l'exécution de stat () whoami
dans un shell séparé n'est pas utile non plus (j'ai besoin de l'uid et du gid pas du nom d'utilisateur).
Cependant, j'ai trouvé un indice utile, je pouvais stat(/proc/self)
et stat(/proc/self/attr)
et voir les uid et gid du fichier.
J'espère que ça aide quelqu'un d'autre
Vous pouvez utiliser ces commandes:
<? system('whoami');?>
ou
<? passthru('whoami');?>
ou
<? print exec('whoami');?>
ou
<? print shell_exec('whoami');?>
ou
<? print get_current_user();?>
J'utilise habituellement
<?php echo get_current_user(); ?>
Je serai heureux si cela t'a aidé
get_current_user() - Gets the name of the owner of the current PHP script
- pas l'utilisateur exécutant le processus PHP.
Un peu tard, mais même si ce qui suit est une solution de contournement, cela résout l'exigence car cela fonctionne très bien:
<?
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
?>
La mise en évidence du code ci-dessus n'est pas précise, veuillez copier et coller dans votre éditeur préféré et afficher sous forme de code PHP, ou enregistrez-le et testez-le vous-même.
Comme vous le savez probablement, get_current_user()
renvoie le propriétaire du "script en cours d'exécution" - donc si vous n'avez pas "chown" un script sur le serveur à l'utilisateur du serveur Web, ce sera probablement "personne", ou si le développeur- l'utilisateur existe sur le même OS, il affichera plutôt ce nom d'utilisateur.
Pour contourner ce problème, nous créons un fichier avec le processus en cours d'exécution. Si vous faites simplement require()
cela dans le script en cours d'exécution, il renverra le même que le script parent comme mentionné; donc, nous devons l'exécuter en tant que demande distincte pour prendre effet.
Afin de rendre cela efficace, envisagez d'exécuter un modèle de conception qui incorpore le "mode d'exécution", donc lorsque le serveur est en "mode de développement ou en mode test", il peut alors exécuter cette fonction et enregistrer sa sortie quelque part dans un include , -ou simplement du texte brut ou de la base de données, ou selon le cas.
Bien sûr, vous pouvez modifier certains détails du code ci-dessus si vous souhaitez le rendre plus dynamique, mais la logique est la suivante:
<?php phpinfo(); ?>
enregistrer sous info.php et
ouvrez info.php dans votre navigateur
ctrl + f puis tapez l'un de ces éléments:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
vous pouvez voir l'utilisateur et le groupe apache sous lequel s'exécute.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Utilisateur authentifié