จะตรวจสอบได้อย่างไรว่า php ผู้ใช้ใดทำงานอยู่?

ฉันต้องตรวจสอบว่า php ทำงานโดยไม่มีใครอยู่หรือไม่ ฉันจะทำอย่างไร?

มีชื่ออื่นสำหรับ "ไม่มีใคร" หรือไม่? “อาปาเช่”? มีคนอื่นอีกไหม?


person Community    schedule 14.10.2011    source แหล่งที่มา
comment
คุณหมายถึงอะไรกันแน่ มีคำถามเกี่ยวกับชื่ออื่นอีกหรือไม่? Sysadmins สามารถสร้างผู้ใช้ด้วยชื่ออะไรก็ได้ที่พวกเขาต้องการ   -  person Álvaro González    schedule 14.10.2011
comment
ชื่อเริ่มต้นอื่นใดสำหรับสิ่งใดก็ตามที่อาจถือเป็นเซิร์ฟเวอร์ Apache, ไม่มีใคร, www-data ฯลฯ   -  person    schedule 14.10.2011
comment
ถ้าฉันจำได้อย่างถูกต้อง ผู้ใช้ระบบมักจะมี UID เล็กน้อย (ต่ำกว่า 1,024?) นั่นอาจเป็นเบาะแสที่ดีกว่าสำหรับสิ่งที่คุณพยายามทำให้สำเร็จ   -  person Álvaro González    schedule 14.10.2011
comment
php.net/manual/en/function.get-current-user. php   -  person E Ciotti    schedule 21.01.2012
comment
get_current_user() ส่งคืนเจ้าของสคริปต์ปัจจุบัน ไม่ใช่ผู้ใช้ php กำลังทำงานอยู่   -  person Dima L.    schedule 06.04.2014


คำตอบ (16)


หากมี คุณสามารถตรวจสอบบัญชีผู้ใช้ปัจจุบันด้วย posix_geteuid จากนั้นรับชื่อผู้ใช้ด้วย posix_getpwuid.

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

อย่างไรก็ตาม หากคุณกำลังทำงานในเซฟโหมด (ซึ่งมักเกิดขึ้นเมื่อปิดใช้งาน exec) ก็ไม่น่าเป็นไปได้ที่กระบวนการ PHP ของคุณจะทำงานภายใต้สิ่งใดๆ ยกเว้นบัญชีเริ่มต้น www-data หรือ apache

person mario    schedule 14.10.2011
comment
มี ความคิดเห็นใน get_current_user() manpage ที่แสดงสิ่งนี้ เข้าใกล้. ใน PHP 5.4 สามารถย่อให้เหลือดังนี้: print posix_getpwuid(posix_geteuid())['name']; - person Palec; 09.08.2015

เป็นแบบย้อนกลับ แต่ไม่มี exec/system:

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

หากคุณสร้างไฟล์ เจ้าของจะเป็นผู้ใช้ PHP

นอกจากนี้ยังสามารถเรียกใช้ฟังก์ชันไฟล์ชั่วคราวใดๆ เช่น tempnam() ซึ่งสร้างไฟล์สุ่มในไฟล์ชั่วคราว ไดเร็กทอรีและส่งคืนชื่อของไฟล์นั้น หากมีปัญหาเนื่องจากบางอย่าง เช่น การอนุญาต open_basedir หรือเซฟโหมดที่ทำให้ไม่สามารถเขียนไฟล์ได้ โดยทั่วไปแล้ว ไดเร็กทอรีชั่วคราวจะยังคงได้รับอนุญาตอยู่

person Jonathan Kuhn    schedule 14.10.2011
comment
โซลูชันข้ามแพลตฟอร์มที่ชาญฉลาดมาก โบ๊ะ! - person Matt Fletcher; 23.05.2014
comment
เยี่ยมเลย: โซลูชันเดียวที่ไม่มีสิทธิพิเศษที่นี่เพื่อค้นหา กลุ่ม ที่ PHP ทำงานอยู่ด้วย - person tanius; 29.12.2014
comment
แฮ็คที่คุ้มค่าสมควรได้รับตำแหน่งที่สูงกว่า - person Abraham Philip; 18.04.2015
comment
ฉันไม่สามารถเขียนถึงไดเร็กทอรีเว็บได้ ซึ่งเป็นสิ่งที่พาฉันมาที่นี่ แต่แทนที่จะติดอยู่กับวงจรแห่งความล้มเหลว ฉันอ่านความคิดเห็นของ Jonathan Kuhn และ tempnam ก็ช่วยได้ ฉันยังคงไม่สามารถเขียนลงในไดเร็กทอรีได้ แต่อย่างน้อยฉันก็ได้ยืนยันว่าฉันเป็นใคร - person Dazbert; 17.05.2016
comment
ขึ้นอยู่กับสิทธิ์ในการเขียน php user ที่มีหรือไม่ และในการให้สิทธิ์ในการเขียน คุณจะต้องทราบชื่อผู้ใช้ ซึ่งในทางปฏิบัติจะเป็นไปได้สำหรับโปรแกรมเมอร์ที่ลืม php user หลังจากกำหนดสิทธิ์ในการเขียนแล้วเท่านั้น - person Ravinder Payal; 23.04.2017
comment
@RavinderPayal ยกเว้นกรณีที่คุณใช้ฟังก์ชัน tempnam อย่างที่ฉันแนะนำ เกือบจะรับประกันได้ว่าผู้ใช้สามารถเขียนลงในไดเร็กทอรีชั่วคราวได้ไม่ว่าพวกเขาจะเป็นใครก็ตาม หากไม่สามารถเขียนลงในไดเร็กทอรีชั่วคราวได้ คุณสามารถให้สิทธิ์แก่โฟลเดอร์ 777 ได้ชั่วคราว และหากเปิดใช้งาน ให้ปิดใช้งาน selinux สำหรับเส้นทางนั้น - person Jonathan Kuhn; 24.04.2017
comment
ได้แล้วครับพี่ ขออภัยที่ไม่ได้อ่านคำตอบสองสามบรรทัดสุดท้าย - person Ravinder Payal; 24.04.2017
comment
@RavinderPayal มีฟังก์ชั่นเพิ่มเติมเพื่อส่งคืนเส้นทางชั่วคราว ดังนั้น $temp_file = tempnam(sys_get_temp_dir(), 'TMP'); จะสร้างไฟล์ชั่วคราวในไดเร็กทอรีชั่วคราวบนระบบส่วนใหญ่ จากนั้นคุณสามารถใช้ไฟล์นั้นเพื่อรับผู้ใช้/กลุ่ม ฉันทิ้งบางส่วนไว้ให้กับผู้ใช้เพื่อหาคำตอบ - person Jonathan Kuhn; 24.04.2017
comment
ขอบคุณพี่ที่เพิ่มมูลค่าในการตอบครับ - person Ravinder Payal; 24.04.2017

รายละเอียดเพิ่มเติมจะมีประโยชน์ แต่สมมติว่าเป็นระบบ linux และสมมติว่า php ทำงานภายใต้ apache มันจะทำงานเหมือนกับที่ apache ของผู้ใช้เคยทำงาน

วิธีง่ายๆ ในการตรวจสอบ (อีกครั้งโดยสมมติว่ามีระบบปฏิบัติการยูนิกซ์เช่นสภาพแวดล้อม) คือการสร้างไฟล์ php ด้วย:

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

ซึ่งจะให้ผู้ใช้แก่คุณ

สำหรับอินสแตนซ์ AWS ของฉัน ฉันได้รับ apache เป็นเอาต์พุตเมื่อฉันเรียกใช้สคริปต์นี้

person Seth    schedule 14.10.2011

คุณสามารถลองใช้ backticks เช่นนี้:

echo `whoami`;
person ricbra    schedule 14.10.2011
comment
มันซ้ำกับคำถามข้างต้น - person volter9; 22.08.2014
comment
อาจมีประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่ง คุณจะได้รับผู้ใช้ที่รันคำสั่ง และ ไม่ใช่ ผู้ใช้ PHP - person Bram Vanroy; 07.09.2016

ฉันจะใช้:

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_
person Lukas Liesis    schedule 08.02.2014
comment
grep "APACHE_RUN_" /etc/apache2/envvars ทำงานได้ดี ขอบคุณ - person Tarik; 26.10.2018

exec('whoami') จะทำสิ่งนี้

<?php
echo exec('whoami');
?>
person genesis    schedule 14.10.2011
comment
ไม่สามารถใช้ exec หรือ system หรือฟังก์ชัน passthru ดังกล่าวได้จริงๆ - person ; 14.10.2011
comment
@เวสลีย์: ดังนั้นมันจึงเป็นไปไม่ได้ - person genesis; 14.10.2011
comment
อาจมีประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่ง คุณจะได้รับผู้ใช้ที่รันคำสั่ง และ ไม่ใช่ ผู้ใช้ PHP - person Bram Vanroy; 07.09.2016

คุณสามารถรันได้โดยตรงจากเชลล์:

php -r "echo exec('whoami');"
person Gabriel Vilches Alves    schedule 09.02.2019

เพิ่มไฟล์ info.php ลงในไดเร็กทอรีต่อไปนี้ - ไดเร็กทอรี http/apache เริ่มต้นของคุณ - ปกติ /var/www/html

โดยมีเนื้อหาดังต่อไปนี้

<?php                                                                           
phpinfo();                                                                    
?>  

จากนั้น httpd/apache รีสตาร์ทไปที่ไดเร็กทอรี html เริ่มต้นของคุณ http://enter.server.here/info.php

จะส่งสายเลือด php ทั้งหมด!

person CRTLBREAK    schedule 10.06.2017
comment
และเรากำลังมองหาตัวแปร / ค่าใดในเอาต์พุตนั้น - person Andrew; 18.07.2018
comment
ฉันแน่ใจว่าคุณพบสิ่งนี้แล้ว แต่ค้นหาผู้ใช้ในหน้านั้น - person CRTLBREAK; 04.01.2019

ในการตั้งค่าของฉัน ฉันต้องการตรวจสอบว่ากระบวนการปัจจุบันมีสิทธิ์ในการสร้างโฟลเดอร์ โฟลเดอร์ย่อย และไฟล์หรือไม่ ก่อนที่จะเริ่มกระบวนการ และแนะนำวิธีแก้ปัญหาหากดูเหมือนว่าฉันทำไม่ได้ ฉันต้องการเรียกใช้ stat(<file>) กับสิ่งต่าง ๆ เพื่อให้แน่ใจว่าการอนุญาตนั้นตรงกับกระบวนการที่ทำงานอยู่ (ฉันใช้ php-fpm ดังนั้นมันจึงแตกต่างกันไปขึ้นอยู่กับพูล)
อย่างไรก็ตามโซลูชันที่ใช้ posix ที่ Mario ให้ไว้ข้างต้นนั้นดูสมบูรณ์แบบ ดูเหมือนว่าส่วนขยาย posix คือ --disabled ดังนั้นฉันจึงไม่สามารถทำข้างต้นได้ และเนื่องจากฉันต้องการเปรียบเทียบผลลัพธ์กับการตอบสนองจากการรัน stat() การรัน whoami ในเชลล์แยกต่างหากก็ไม่มีประโยชน์เช่นกัน (ฉันต้องการ uid และ gid ไม่ใช่ชื่อผู้ใช้)

อย่างไรก็ตาม ฉันพบคำแนะนำที่เป็นประโยชน์ ฉันสามารถ stat(/proc/self) และ stat(/proc/self/attr) และดู uid และ gid ของไฟล์ได้

หวังว่าจะช่วยคนอื่นได้

person sibaz    schedule 22.04.2014

ฉันมักจะใช้

<?php echo get_current_user(); ?>

ฉันจะดีใจถ้ามันช่วยคุณ

person yiimar    schedule 03.06.2016
comment
สิ่งนี้ได้ถูกกล่าวถึงแล้วในความคิดเห็นภายใต้คำถาม และมีส่วนเกี่ยวข้องเพียงเล็กน้อยกับผู้ใช้ที่สคริปต์กำลังทำงานอยู่ - person Palec; 03.06.2016
comment
get_current_user() - Gets the name of the owner of the current PHP script - ไม่ใช่ ผู้ใช้ที่เรียกใช้กระบวนการ PHP - person Francisco Zarabozo; 04.02.2017

ข้อเสนอ

ช้าไปหน่อย แต่ถึงแม้สิ่งต่อไปนี้จะเป็นวิธีแก้ปัญหา แต่ก็แก้ไขข้อกำหนดได้เนื่องจากทำงานได้ดี:

<?
    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() ส่งคืนเจ้าของ "สคริปต์ที่กำลังทำงานอยู่ในปัจจุบัน" - ดังนั้นหากคุณไม่ได้ "chown" สคริปต์บนเซิร์ฟเวอร์ให้กับผู้ใช้เว็บเซิร์ฟเวอร์ สคริปต์นั้นอาจจะเป็น "ไม่มีใคร" หรือหากนักพัฒนา -user มีอยู่ในระบบปฏิบัติการเดียวกัน แต่จะแสดงชื่อผู้ใช้นั้นแทน

เพื่อแก้ไขปัญหานี้ เราสร้างไฟล์ที่มีกระบวนการทำงานอยู่ในปัจจุบัน หากคุณเพียงแค่ require() สิ่งนี้ลงในสคริปต์ที่รันอยู่ในปัจจุบัน มันจะส่งคืนเหมือนกับสคริปต์หลักดังที่กล่าวไว้ ดังนั้นเราจึงต้องเรียกใช้เป็นคำขอแยกต่างหากจึงจะมีผล

กระบวนการไหล

เพื่อให้สิ่งนี้มีประสิทธิภาพ ให้พิจารณาเรียกใช้รูปแบบการออกแบบที่รวม "โหมดรันไทม์" ดังนั้นเมื่อเซิร์ฟเวอร์อยู่ใน "โหมดการพัฒนาหรือโหมดทดสอบ" จะมีเพียงเซิร์ฟเวอร์เท่านั้นที่สามารถเรียกใช้ฟังก์ชันนี้และบันทึกเอาต์พุตไว้ที่ใดที่หนึ่งในการรวม , -หรือเพียงข้อความธรรมดาหรือฐานข้อมูลหรืออย่างใดอย่างหนึ่ง

แน่นอนคุณสามารถเปลี่ยนรายละเอียดบางอย่างของโค้ดด้านบนได้ตามที่คุณต้องการเพื่อทำให้โค้ดมีความไดนามิกมากขึ้น แต่ตรรกะจะเป็นดังนี้:

  • กำหนดการอ้างอิงเฉพาะเพื่อจำกัดการรบกวนผู้ใช้รายอื่น
  • กำหนดเส้นทางไฟล์ในเครื่องสำหรับการเขียนไฟล์ชั่วคราว
  • กำหนด URL/เส้นทางสาธารณะเพื่อเรียกใช้ไฟล์นี้ในกระบวนการของตัวเอง
  • เขียนไฟล์ php ชั่วคราวที่ส่งออกชื่อเจ้าของสคริปต์
  • รับเอาต์พุตของสคริปต์นี้โดยการร้องขอ
  • ลบไฟล์เนื่องจากไม่จำเป็นอีกต่อไป - หรือปล่อยไว้ถ้าคุณต้องการ
  • ส่งคืนเอาต์พุตของการร้องขอเป็นค่าส่งคืนของฟังก์ชัน
person Community    schedule 26.05.2017

<?php phpinfo(); ?>

บันทึกเป็น info.php และ

เปิด info.php ในเบราว์เซอร์ของคุณ

ctrl+f จากนั้นพิมพ์สิ่งใดสิ่งหนึ่งต่อไปนี้:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

คุณสามารถเห็นผู้ใช้และกลุ่ม apache กำลังทำงานอยู่

person Jerome Jr. Formentera    schedule 13.11.2018

คุณสามารถใช้คำสั่งเหล่านี้:

<? system('whoami');?>

or

<? passthru('whoami');?>

or

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

or

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

โปรดทราบว่า get_current_user() ส่งคืนชื่อของเจ้าของสคริปต์ PHP ปัจจุบัน !

person Freeman    schedule 23.05.2019
comment
get_current_user() ไม่ ส่งคืนผู้ใช้ปัจจุบัน มันจะส่งคืนเจ้าของสคริปต์ที่เรียกใช้ฟังก์ชัน - person andsens; 26.08.2019

$user = $_SERVER['REMOTE_USER'];

http://php.net

ผู้ใช้ที่ได้รับการรับรองความถูกต้อง

person Tybion    schedule 04.10.2018

person    schedule
comment
ไม่สามารถใช้ exec หรือ system หรือฟังก์ชัน passthru ดังกล่าวได้จริงๆ - person ; 14.10.2011
comment
เป็นเพียงสิ่งที่ฉันต้องการ get_current_user() ไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน - person dgig; 29.06.2016
comment
อาจมีประโยชน์สำหรับผู้ใช้บางคน: หากคุณเรียกใช้สิ่งนี้จากอินเทอร์เฟซบรรทัดคำสั่ง คุณจะได้รับผู้ใช้ที่รันคำสั่ง และ ไม่ใช่ ผู้ใช้ PHP - person Bram Vanroy; 07.09.2016
comment
@BramVanroy แล้วคุณควรรันมันที่ไหน? =| - person Andrew; 18.07.2018
comment
@BramVanroy - ฉันต้องการที่จะเข้าใจความคิดเห็นของคุณ แต่ฉันไม่เข้าใจ หากคุณเรียกใช้จาก cli คุณเป็นเจ้าของกระบวนการ php ปัจจุบันไม่ใช่หรือ ผู้ใช้ PHP ในกรณีนี้คือใครนอกจากคุณ? - person billynoah; 07.12.2018
comment
ใน C-Panel ตัวเลือกนั้นจะถูกปิดใช้งานตามค่าเริ่มต้น อย่างน้อยก็ในสองเว็บไซต์ที่ฉันตรวจสอบ - person OAH; 24.04.2019

person    schedule
comment
echo $_SERVER["USER"]; ใช้งานได้ แต่ให้ชื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันใน SSH - person Tarik; 26.10.2018