Comment vérifier sous quel utilisateur PHP s'exécute?

115

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?

Wesley
la source
Que voulez-vous dire exactement par la question «y a-t-il d'autres noms»? Les administrateurs système peuvent créer des utilisateurs avec le nom de leur choix.
Álvaro González
Tout autre nom par défaut pour tout ce qui pourrait être considéré comme le serveur; apache, personne, www-data, etc.
Wesley
1
Si je me souviens bien, les utilisateurs du système ont normalement un petit UID (inférieur à 1024?). Cela pourrait être un meilleur indice pour tout ce que vous essayez d'accomplir.
Álvaro González
9
get_current_user () renvoie le propriétaire du script actuel, et non l'utilisateur php en cours d'exécution.
Dima L.

Réponses:

85

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-dataou le apachecompte.

mario
la source
10
Il y a un commentaire sur la 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'];
Palec
209

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

AlienWebguy
la source
1
Je ne peux pas vraiment utiliser exec ou system ou aucune de ces fonctions passthru.
Wesley
C'était exactement ce dont j'avais besoin. get_current_user () n'était pas vraiment ce dont j'avais besoin.
dgig le
5
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
@BramVanroy alors où devriez-vous l'exécuter? = |
Andrew
@BramVanroy - Je veux comprendre votre commentaire, mais je ne le fais pas. si vous exécutez cela à partir du cli, n'est-ce pas vous qui possédez le processus php actuel? Qui serait l'utilisateur PHP dans ce cas autre que vous?
billynoah
72

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_basedirou le mode sans échec qui empêchent l'écriture d'un fichier, généralement, le répertoire temporaire sera toujours autorisé.

Jonathan Kuhn
la source
2
Solution multiplateforme très intelligente. Boh!
Matt Fletcher
3
Nice: la seule solution non privilégiée ici pour trouver également le groupe sous lequel PHP s'exécute.
tanius
2
un hack digne, mérite une place plus élevée
Abraham Philip
1
@RavinderPayal Sauf si vous utilisez la fonction tempnam comme je l'ai suggéré. Il est presque garanti que l'utilisateur peut écrire dans le répertoire temporaire, quel qu'il soit. Sans pouvoir écrire dans le répertoire temporaire, vous pouvez temporairement accorder des autorisations 777 à un dossier et, s'il est activé, désactiver selinux pour ce chemin.
Jonathan Kuhn
1
@RavinderPayal il existe des fonctions supplémentaires pour renvoyer le chemin temporaire. Ainsi $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.
Jonathan Kuhn
20

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 apachesortie lorsque j'exécute ce script.

Seth
la source
16

Vous pouvez essayer d'utiliser des backticks comme ceci:

echo `whoami`;
Ricbra
la source
7
C'est juste une copie des questions ci-dessus.
volter9
2
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
12

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_
Lukas Liesis
la source
1
grep "APACHE_RUN_" /etc/apache2/envvarsa bien fonctionné, merci.
Tarik
11

exec('whoami') fera ça

<?php
echo exec('whoami');
?>
genèse
la source
Je ne peux pas vraiment utiliser exec ou system ou aucune de ces fonctions passthru.
Wesley
@Wesley: donc ce n'est pas possible.
genesis
2
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
5

Directement depuis le shell, vous pouvez exécuter:

php -r "echo exec('whoami');"
Gabriel Vilches Alves
la source
1

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!

CRTLBREAK
la source
3
et quelle variable / valeur recherchons-nous dans cette sortie?
Andrew
Je suis sûr que vous l'avez déjà trouvé, mais recherchez "utilisateur" sur cette page?
CRTLBREAK
0

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 () whoamidans 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

Sibaz
la source
0

Vous pouvez utiliser ces commandes:

<? system('whoami');?>

ou

<? passthru('whoami');?>

ou

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

ou

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

ou

<? print get_current_user();?>
Homme libre
la source
get_current_user () ne renvoie pas l'utilisateur actuel. Il renvoie le propriétaire du script dans
lequel
-1

J'utilise habituellement

<?php echo get_current_user(); ?>

Je serai heureux si cela t'a aidé

yiimar
la source
Cela a déjà été mentionné dans les commentaires sous la question et cela n'a que très peu à voir avec l'utilisateur sous lequel le script s'exécute.
Palec
get_current_user() - Gets the name of the owner of the current PHP script- pas l'utilisateur exécutant le processus PHP.
Francisco Zarabozo le
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Étape
la source
echo $_SERVER["USER"];fonctionne mais donne le nom d'utilisateur actuellement connecté en SSH.
Tarik
-1

Proposition

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 description

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.

Flux de processus

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:

  • définir une référence unique pour limiter les interférences avec les autres utilisateurs
  • définir un chemin de fichier local pour écrire un fichier temporaire
  • définir une URL / un chemin public pour exécuter ce fichier dans son propre processus
  • écrire le fichier php temporaire qui renvoie le nom du propriétaire du script
  • obtenir la sortie de ce script en lui faisant une requête
  • supprimez le fichier car il n'est plus nécessaire - ou laissez-le si vous le souhaitez
  • renvoie la sortie de la requête comme valeur de retour de la fonction

la source
-1
<?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.

Jerome Jr. Formentera
la source