get_current_user () zwraca właściciela bieżącego skryptu, a nie użytkownika, który aktualnie działa.
Dima L.,
Odpowiedzi:
85
Jeśli jest dostępny, możesz sprawdzić bieżące konto użytkownika za pomocą, posix_geteuida następnie uzyskać nazwę użytkownika za pomocą posix_getpwuid.
Jeśli jednak pracujesz w trybie awaryjnym (co często ma miejsce, gdy exec jest wyłączony), jest mało prawdopodobne, że Twój proces PHP działa na jakimkolwiek koncie poza domyślnym www-datalub apachekontem.
Naprawdę nie można użyć funkcji exec, system ani żadnej z takich funkcji tranzytowych.
Wesley,
To było to, czego potrzebowałem. get_current_user () zdecydowanie nie był tym, czego potrzebowałem.
dgig
5
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
Bram Vanroy,
@BramVanroy to gdzie powinieneś go uruchomić? = |
Andrew
@BramVanroy - Chcę zrozumieć twój komentarz, ale nie rozumiem. jeśli uruchomisz to z CLI, czy nie jesteś właścicielem obecnego procesu php? Kim byłby w tym przypadku użytkownik PHP oprócz Ciebie?
Jeśli utworzysz plik, właścicielem będzie użytkownik PHP.
Prawdopodobnie można to również uruchomić z dowolną funkcją pliku tymczasowego, taką jak tempnam(), która tworzy losowy plik w katalogu tymczasowym i zwraca nazwę tego pliku. Jeśli występują problemy wynikające z czegoś takiego jak uprawnienia open_basedirlub tryb awaryjny, które uniemożliwiają zapisanie pliku, zazwyczaj katalog tymczasowy nadal będzie dozwolony.
Fajnie: jedyne nieuprzywilejowane rozwiązanie, które pozwala również znaleźć grupę, w której działa PHP.
tanius
2
godny hack, zasługuje na wyższe miejsce
Abraham Philip
1
@RavinderPayal Chyba że używasz funkcji tempnam, tak jak zasugerowałem. Jest prawie pewne, że użytkownik może pisać do katalogu tymczasowego niezależnie od tego, kim jest. Bez możliwości zapisu w katalogu tymczasowym, można tymczasowo nadać folderowi 777 uprawnienia i wyłączyć selinux dla tej ścieżki, jeśli jest włączony.
Jonathan Kuhn
1
@RavinderPayal są dodatkowe funkcje zwracające ścieżkę tymczasową. Utworzyłby więc $temp_file = tempnam(sys_get_temp_dir(), 'TMP');plik tymczasowy w katalogu tymczasowym w większości systemów. Możesz następnie użyć tego pliku, aby pobrać użytkownika / grupę. Zostawiłem część tego użytkownikowi, aby się domyślił.
Jonathan Kuhn
20
Przydałoby się więcej szczegółów, ale zakładając, że jest to system linuxowy i zakładając, że php działa pod Apache, będzie działał tak, jak działa apache użytkownika.
Łatwym sposobem sprawdzenia (ponownie, zakładając pewne środowisko podobne do unixa) jest utworzenie pliku php z:
<?php
print shell_exec('whoami');?>
co da ci użytkownika.
W przypadku mojej instancji AWS otrzymuję apachedane wyjściowe po uruchomieniu tego skryptu.
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
Bram Vanroy,
13
użyłbym:
lsof -i
lsof -i | less
lsof -i | grep :http
którykolwiek z nich. Możesz wpisać em w linii poleceń ssh, a zobaczysz, który użytkownik nasłuchuje jakiej usługi.
Naprawdę nie można użyć funkcji exec, system ani żadnej z takich funkcji tranzytowych.
Wesley,
@Wesley: więc to niemożliwe.
genesis
2
Może być przydatne dla niektórych użytkowników: jeśli uruchomisz to z interfejsu wiersza poleceń, otrzymasz użytkownika, który uruchamia polecenie, a nie użytkownika PHP.
i jakiej zmiennej / wartości w tym wyjściu szukamy?
Andrew
Jestem pewien, że już to znalazłeś, ale szukasz „użytkownik” na tej stronie?
CRTLBREAK
0
W mojej konfiguracji chcę sprawdzić, czy bieżący proces ma uprawnienia do tworzenia folderów, podfolderów i plików przed rozpoczęciem procesu i zasugerować rozwiązanie, jeśli wygląda na to, że nie mogę. Chciałem uruchamiać stat(<file>)różne rzeczy, aby upewnić się, że uprawnienia pasują do uruchomionego procesu (używam php-fpm, więc różni się w zależności od puli).
Rozwiązanie oparte na posix, które Mario podał powyżej, wydaje się idealne, jednak wydaje się, że rozszerzenie posix jest - wyłączone, więc nie mogłem zrobić tego powyżej i ponieważ chcę porównać wyniki z odpowiedzią po uruchomieniu stat () działającym whoamiw oddzielnej powłoce też nie jest pomocna (potrzebuję uid i gid, a nie nazwy użytkownika).
Jednak uważam użyteczną wskazówkę, mogłem stat(/proc/self)i stat(/proc/self/attr)i zobaczyć UID i GID pliku.
Podświetlanie kodu powyżej nie jest dokładne, skopiuj i wklej w swoim ulubionym edytorze i wyświetl jako kod PHP lub zapisz i przetestuj samodzielnie.
Jak zapewne wiesz, get_current_user()zwraca właściciela „aktualnie uruchomionego skryptu” - więc jeśli nie „wyrzuciłeś” skryptu na serwerze do użytkownika serwera WWW, najprawdopodobniej będzie to „nikt” lub jeśli programista- użytkownik istnieje w tym samym systemie operacyjnym, będzie raczej wyświetlać tę nazwę użytkownika.
Aby obejść ten problem, tworzymy plik z aktualnie uruchomionym procesem. Jeśli dodasz require()to tylko do aktualnie działającego skryptu, zwróci to samo, co wspomniany skrypt nadrzędny; więc musimy uruchomić to jako oddzielne żądanie, aby odniosło skutek.
Przebieg procesu
Aby uczynić to skutecznym, rozważ uruchomienie wzorca projektowego, który zawiera "tryb wykonawczy", więc gdy serwer jest w "trybie programistycznym lub testowym", tylko on może uruchomić tę funkcję i zapisać jej dane wyjściowe gdzieś w dołączonej , -lub po prostu zwykły tekst lub baza danych lub cokolwiek.
Oczywiście możesz zmienić niektóre szczegóły powyższego kodu, aby uczynić go bardziej dynamicznym, ale logika jest następująca:
zdefiniować unikalne odniesienie, aby ograniczyć interferencję z innymi użytkownikami
zdefiniuj lokalną ścieżkę do pliku do zapisu pliku tymczasowego
zdefiniuj publiczny adres URL / ścieżkę do uruchamiania tego pliku we własnym procesie
napisz tymczasowy plik php, który wypisuje nazwę właściciela skryptu
uzyskać wynik tego skryptu, wysyłając do niego żądanie
usuń plik, ponieważ nie jest już potrzebny - lub zostaw go, jeśli chcesz
zwraca wynik żądania jako wartość zwracaną przez funkcję
Odpowiedzi:
Jeśli jest dostępny, możesz sprawdzić bieżące konto użytkownika za pomocą,
posix_geteuid
a następnie uzyskać nazwę użytkownika za pomocąposix_getpwuid
.Jeśli jednak pracujesz w trybie awaryjnym (co często ma miejsce, gdy exec jest wyłączony), jest mało prawdopodobne, że Twój proces PHP działa na jakimkolwiek koncie poza domyślnym
www-data
lubapache
kontem.źródło
get_current_user()
podręcznika jest komentarz, który pokazuje takie podejście. Od PHP 5.4 można to skrócić do tego:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
źródło
Coś w stylu wstecznym, ale bez exec / system:
Jeśli utworzysz plik, właścicielem będzie użytkownik PHP.
Prawdopodobnie można to również uruchomić z dowolną funkcją pliku tymczasowego, taką jak
tempnam()
, która tworzy losowy plik w katalogu tymczasowym i zwraca nazwę tego pliku. Jeśli występują problemy wynikające z czegoś takiego jak uprawnieniaopen_basedir
lub tryb awaryjny, które uniemożliwiają zapisanie pliku, zazwyczaj katalog tymczasowy nadal będzie dozwolony.źródło
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
plik tymczasowy w katalogu tymczasowym w większości systemów. Możesz następnie użyć tego pliku, aby pobrać użytkownika / grupę. Zostawiłem część tego użytkownikowi, aby się domyślił.Przydałoby się więcej szczegółów, ale zakładając, że jest to system linuxowy i zakładając, że php działa pod Apache, będzie działał tak, jak działa apache użytkownika.
Łatwym sposobem sprawdzenia (ponownie, zakładając pewne środowisko podobne do unixa) jest utworzenie pliku php z:
co da ci użytkownika.
W przypadku mojej instancji AWS otrzymuję
apache
dane wyjściowe po uruchomieniu tego skryptu.źródło
Możesz spróbować użyć grawisów w ten sposób:
źródło
użyłbym:
którykolwiek z nich. Możesz wpisać em w linii poleceń ssh, a zobaczysz, który użytkownik nasłuchuje jakiej usługi.
możesz też przejść i sprawdzić ten plik:
i poszukaj tych wierszy:
aby odfiltrować dane pliku envvars, możesz użyć grep:
źródło
grep "APACHE_RUN_" /etc/apache2/envvars
działało dobrze, dzięki.exec('whoami')
zrobi toźródło
Prosto z muszli można uruchomić:
źródło
dodaj plik info.php do następującego katalogu - domyślny katalog http / apache - normalnie / var / www / html
z następującą treścią
Następnie httpd / apache uruchom ponownie, przejdź do domyślnego katalogu html http://enter.server.here/info.php
dostarczy cały rodowód php!
źródło
W mojej konfiguracji chcę sprawdzić, czy bieżący proces ma uprawnienia do tworzenia folderów, podfolderów i plików przed rozpoczęciem procesu i zasugerować rozwiązanie, jeśli wygląda na to, że nie mogę. Chciałem uruchamiać
stat(<file>)
różne rzeczy, aby upewnić się, że uprawnienia pasują do uruchomionego procesu (używam php-fpm, więc różni się w zależności od puli).Rozwiązanie oparte na posix, które Mario podał powyżej, wydaje się idealne, jednak wydaje się, że rozszerzenie posix jest - wyłączone, więc nie mogłem zrobić tego powyżej i ponieważ chcę porównać wyniki z odpowiedzią po uruchomieniu stat () działającym
whoami
w oddzielnej powłoce też nie jest pomocna (potrzebuję uid i gid, a nie nazwy użytkownika).Jednak uważam użyteczną wskazówkę, mogłem
stat(/proc/self)
istat(/proc/self/attr)
i zobaczyć UID i GID pliku.Mam nadzieję, że to pomoże komuś innemu
źródło
Możesz użyć tych poleceń:
lub
lub
lub
lub
źródło
Zwykle używam
Byłbym zadowolony, gdyby ci to pomogło
źródło
get_current_user() - Gets the name of the owner of the current PHP script
- nie użytkownik uruchamiający proces PHP.źródło
echo $_SERVER["USER"];
działa, ale podaje nazwę aktualnie zalogowanego użytkownika w SSH.Wniosek
Trochę późno, ale chociaż poniższe rozwiązanie jest obejściem, to rozwiązuje to wymaganie, ponieważ działa dobrze:
Opis
Podświetlanie kodu powyżej nie jest dokładne, skopiuj i wklej w swoim ulubionym edytorze i wyświetl jako kod PHP lub zapisz i przetestuj samodzielnie.
Jak zapewne wiesz,
get_current_user()
zwraca właściciela „aktualnie uruchomionego skryptu” - więc jeśli nie „wyrzuciłeś” skryptu na serwerze do użytkownika serwera WWW, najprawdopodobniej będzie to „nikt” lub jeśli programista- użytkownik istnieje w tym samym systemie operacyjnym, będzie raczej wyświetlać tę nazwę użytkownika.Aby obejść ten problem, tworzymy plik z aktualnie uruchomionym procesem. Jeśli dodasz
require()
to tylko do aktualnie działającego skryptu, zwróci to samo, co wspomniany skrypt nadrzędny; więc musimy uruchomić to jako oddzielne żądanie, aby odniosło skutek.Przebieg procesu
Aby uczynić to skutecznym, rozważ uruchomienie wzorca projektowego, który zawiera "tryb wykonawczy", więc gdy serwer jest w "trybie programistycznym lub testowym", tylko on może uruchomić tę funkcję i zapisać jej dane wyjściowe gdzieś w dołączonej , -lub po prostu zwykły tekst lub baza danych lub cokolwiek.
Oczywiście możesz zmienić niektóre szczegóły powyższego kodu, aby uczynić go bardziej dynamicznym, ale logika jest następująca:
źródło
zapisz jako info.php i
otwórz info.php w swojej przeglądarce
ctrl + f, a następnie wpisz dowolne z poniższych:
możesz zobaczyć użytkownika i grupę Apache działa jako.
źródło
http://php.net/manual/en/reserved.variables.server.php
Uwierzytelniony użytkownik
źródło