Wie überprüfe ich, als welcher Benutzer PHP ausgeführt wird?

115

Ich muss erkennen, ob PHP als niemand läuft. Wie mache ich das?

Gibt es noch andere Namen für "niemand"? "Apache"? Irgendwelche anderen?

Wesley
quelle
Was meinst du genau mit der Frage "Gibt es noch andere Namen?" Sysadmins können Benutzer mit einem beliebigen Namen erstellen.
Álvaro González
Alle anderen Standardnamen für alles, was als Server betrachtet werden könnte; Apache, niemand, www-Daten, etc ..
Wesley
1
Wenn ich mich richtig erinnere, haben Systembenutzer normalerweise eine kleine UID (unter 1024?). Das könnte ein besserer Hinweis für alles sein, was Sie erreichen wollen.
Álvaro González
9
get_current_user () gibt den Besitzer des aktuellen Skripts zurück, nicht den Benutzer, den PHP gerade ausführt.
Dima L.

Antworten:

85

Falls verfügbar, können Sie das aktuelle Benutzerkonto mit prüfen posix_geteuidund dann den Benutzernamen mit abrufen posix_getpwuid.

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

Wenn Sie jedoch im abgesicherten Modus ausgeführt wird (was oft der Fall ist , wenn exec deaktiviert ist), dann ist es unwahrscheinlich , dass Ihr PHP - Prozess unter etwas läuft , aber das Standard - www-dataoder apacheKonto.

Mario
quelle
10
Es gibt einen Kommentar auf der get_current_user()Manpage , der diesen Ansatz zeigt. Ab PHP 5.4 kann es wie folgt gekürzt werden:print posix_getpwuid(posix_geteuid())['name'];
Palec
209

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

AlienWebguy
quelle
1
Exec oder System oder solche Durchgangsfunktionen können nicht wirklich verwendet werden.
Wesley
War genau das, was ich brauchte. get_current_user () war definitiv nicht das, was ich brauchte.
Dgig
5
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
Bram Vanroy
@BramVanroy wo solltest du es dann ausführen? = |
Andrew
@BramVanroy - Ich möchte Ihren Kommentar verstehen, aber ich nicht. Wenn Sie das von der CLI aus ausführen, sind Sie nicht der Eigentümer des aktuellen PHP-Prozesses? Wer wäre der PHP-Benutzer in diesem Fall anders als Sie?
Billynoah
72

Art rückwärts, aber ohne exec / system:

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

Wenn Sie eine Datei erstellen, ist der Eigentümer der PHP-Benutzer.

Dies kann wahrscheinlich auch mit einer der temporären Dateifunktionen ausgeführt werden, z. B. tempnam()die eine zufällige Datei im temporären Verzeichnis erstellt und den Namen dieser Datei zurückgibt. Wenn es Probleme aufgrund von Berechtigungen open_basediroder des abgesicherten Modus gibt, die das Schreiben einer Datei verhindern, ist das temporäre Verzeichnis normalerweise weiterhin zulässig.

Jonathan Kuhn
quelle
2
Sehr clevere plattformübergreifende Lösung. Boh!
Matt Fletcher
3
Schön: Die einzige nicht privilegierte Lösung hier, um auch die Gruppe zu finden, als die PHP ausgeführt wird.
Tanius
2
Ein würdiger Hack, verdient einen höheren Platz
Abraham Philip
1
@ RavinderPayal Es sei denn, Sie verwenden die Tempnam-Funktion, wie ich vorgeschlagen habe. Es ist fast garantiert, dass der Benutzer in das temporäre Verzeichnis schreiben kann, unabhängig davon, wer er ist. Ohne in das temporäre Verzeichnis schreiben zu können, können Sie einem Ordner vorübergehend 777 Berechtigungen erteilen und, falls aktiviert, Selinux für diesen Pfad deaktivieren.
Jonathan Kuhn
1
@ RavinderPayal Es gibt zusätzliche Funktionen, um den temporären Pfad zurückzugeben. So $temp_file = tempnam(sys_get_temp_dir(), 'TMP');würde eine temporäre Datei im temporären Verzeichnis auf fast jedem System erstellen. Sie können diese Datei dann verwenden, um den Benutzer / die Gruppe abzurufen. Ich habe einiges davon dem Benutzer überlassen, um es herauszufinden.
Jonathan Kuhn
20

Weitere Details wären nützlich, aber wenn es sich um ein Linux-System handelt und wenn PHP unter Apache ausgeführt wird, wird es so ausgeführt, wie der Benutzer-Apache ausgeführt wird.

Eine einfache Möglichkeit, dies zu überprüfen (wiederum unter der Annahme einer Unix-ähnlichen Umgebung), besteht darin, eine PHP-Datei zu erstellen mit:

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

das gibt Ihnen den Benutzer.

Für meine AWS-Instanz bekomme ich apache beim Ausführen dieses Skripts eine Ausgabe angezeigt.

Seth
quelle
16

Sie können versuchen, Backticks wie folgt zu verwenden:

echo `whoami`;
Ricbra
quelle
7
Es ist nur ein Duplikat der obigen Fragen.
Volter9
2
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
Bram Vanroy
12

ich würde ... benutzen:

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

eines davon. Sie können em in Ihre ssh-Befehlszeile eingeben und sehen, welcher Benutzer welchen Dienst abhört.

Sie können diese Datei auch überprüfen:

more /etc/apache2/envvars

und suchen Sie nach diesen Zeilen:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

Um die Daten der envvars-Datei herauszufiltern, können Sie grep verwenden:

 more  /etc/apache2/envvars |grep APACHE_RUN_
Lukas Liesis
quelle
1
grep "APACHE_RUN_" /etc/apache2/envvarshat gut funktioniert, danke.
Tarik
11

exec('whoami') werde das tun

<?php
echo exec('whoami');
?>
Genesis
quelle
Exec oder System oder solche Durchgangsfunktionen können nicht wirklich verwendet werden.
Wesley
@ Wesley: Das ist also nicht möglich.
Genesis
2
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
Bram Vanroy
5

Direkt aus der Shell können Sie laufen:

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

Fügen Sie die Datei info.php dem folgenden Verzeichnis hinzu - Ihrem Standardverzeichnis http / apache - normalerweise / var / www / html

mit folgenden Inhalten

<?php                                                                           
phpinfo();                                                                    
?>  

Starten Sie anschließend httpd / apache neu und wechseln Sie in Ihr Standard-HTML-Verzeichnis http://enter.server.here/info.php

würde den ganzen PHP-Stammbaum liefern!

CRTLBREAK
quelle
3
und welche Variable / Wert in dieser Ausgabe suchen wir?
Andrew
Ich bin sicher, dass Sie dies bereits gefunden haben, aber auf dieser Seite nach "Benutzer" suchen?
CRTLBREAK
0

In meinem Setup möchte ich überprüfen, ob der aktuelle Prozess die Berechtigung zum Erstellen von Ordnern, Unterordnern und Dateien hat, bevor ich einen Prozess beginne, und eine Lösung vorschlagen, wenn es so aussieht, als ob ich es nicht kann. Ich wollte stat(<file>)verschiedene Dinge ausführen, um sicherzustellen, dass die Berechtigungen mit denen des laufenden Prozesses übereinstimmen (ich verwende php-fpm, daher variiert dies je nach Pool).
Die oben angegebene posix-basierte Lösung, die Mario oben angegeben hat, scheint perfekt zu sein, jedoch scheint die posix-Erweiterung --disabled zu sein, sodass ich die oben genannten Schritte nicht ausführen konnte und die Ergebnisse mit der Antwort von stat () vergleichen möchte, die whoamiin einer separaten Shell ausgeführt wird ist auch nicht hilfreich (ich brauche die UID und GID nicht den Benutzernamen).

Ich fand jedoch einen nützlichen Hinweis, ich konnte stat(/proc/self)und stat(/proc/self/attr)und sah die UID und GID der Datei.

Hoffe das hilft jemand anderem

sibaz
quelle
0

Sie können diese Befehle verwenden:

<? system('whoami');?>

oder

<? passthru('whoami');?>

oder

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

oder

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

oder

<? print get_current_user();?>
Freeman
quelle
get_current_user () gibt den aktuellen Benutzer nicht zurück. Es gibt den Eigentümer des Skripts zurück, in dem die Funktion aufgerufen wird.
andsens
-1

Ich benutze normalerweise

<?php echo get_current_user(); ?>

Ich werde mich freuen, wenn es Ihnen geholfen hat

Yiimar
quelle
Dies wurde bereits in den Kommentaren unter der Frage erwähnt und hat nur sehr wenig mit dem Benutzer zu tun, unter dem das Skript ausgeführt wird.
Palec
get_current_user() - Gets the name of the owner of the current PHP script- nicht der Benutzer, der den PHP-Prozess ausführt.
Francisco Zarabozo
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Schritt
quelle
echo $_SERVER["USER"];funktioniert, gibt aber den aktuell angemeldeten Benutzernamen in SSH an.
Tarik
-1

Vorschlag

Ein bisschen spät, aber obwohl das Folgende eine Problemumgehung ist, löst es die Anforderung, da dies gut funktioniert:

<?
    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
?>


Beschreibung

Die obige Code-Hervorhebung ist nicht korrekt. Kopieren Sie sie in Ihren bevorzugten Editor und zeigen Sie sie als PHP-Code an oder speichern und testen Sie sie selbst.

Wie du wahrscheinlich weißt, get_current_user() der Eigentümer des "aktuell ausgeführten Skripts" zurückgegeben. Wenn Sie also dem Webserver-Benutzer kein Skript auf dem Server "chown" haben, ist es höchstwahrscheinlich "niemand", oder wenn der Entwickler- Benutzer existiert auf demselben Betriebssystem, es wird eher dieser Benutzername angezeigt.

Um dies zu umgehen, erstellen wir eine Datei mit dem aktuell ausgeführten Prozess. Wenn Sie dies nur require()in das aktuell ausgeführte Skript eingeben, wird dasselbe wie das übergeordnete Skript wie erwähnt zurückgegeben. Daher müssen wir es als separate Anforderung ausführen, um wirksam zu werden.

Prozessablauf

Um dies effektiv zu gestalten, sollten Sie ein Entwurfsmuster ausführen, das den "Laufzeitmodus" enthält. Wenn sich der Server also im "Entwicklungsmodus oder Testmodus" befindet, kann nur er diese Funktion ausführen und seine Ausgabe irgendwo in einem Include speichern , -oder einfach nur Text oder Datenbank oder was auch immer.

Natürlich können Sie einige Details des obigen Codes ändern, um ihn dynamischer zu gestalten, aber die Logik lautet wie folgt:

  • Definieren Sie eine eindeutige Referenz, um Interferenzen mit anderen Benutzern zu begrenzen
  • Definieren Sie einen lokalen Dateipfad zum Schreiben einer temporären Datei
  • Definieren Sie eine öffentliche URL / einen öffentlichen Pfad, um diese Datei in einem eigenen Prozess auszuführen
  • schreibe die temporäre PHP-Datei, die den Namen des Skriptbesitzers ausgibt
  • Rufen Sie die Ausgabe dieses Skripts ab, indem Sie eine Anfrage an das Skript senden
  • Löschen Sie die Datei, da sie nicht mehr benötigt wird - oder lassen Sie sie, wenn Sie möchten
  • Gibt die Ausgabe der Anforderung als Rückgabewert der Funktion zurück

quelle
-1
<?php phpinfo(); ?>

Speichern Sie als info.php und

öffne info.php in deinem Browser

Geben Sie dann Strg + F ein und geben Sie eine der folgenden Optionen ein:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

Sie können sehen, dass der Benutzer und der Gruppenapache als ausgeführt werden.

Jerome Jr. Formentera
quelle