เช็ค file owner permission โดย php

Byphunsanit

เช็ค file owner permission โดย php

อัพงานที่ทำแล้วมีอาการแปลกๆ login ไม่ได้ upload view ขึ้นไปใหม่ก็ไม่เปลี่ยน ลองเข้าไปลบ cache เอง ถึงจะหาย ใช้ไปไม่นานก้เป็นอีก คิดว่าเป็นปัญหาที่ไฟล์ permission และไฟล์ owner ลองสังเกตดูเจ้าของไฟล์ที่ ftp ขึ้นไปมีเจ้าของคนละเลขกัน ( ดูใน filezila ก็ได้มันก็โชว์ )

เป็นธรรมดาที่เฟรมเวิร์กเดี๋ยวนี้จะสร้างไฟล์ขึ้นมาเองเพื่อทำเป็น cache หรือ auto-loading ต่างๆ ขึ้นมาเอง อย่าง laravel หลักๆก็จะอยู่ที่ /storage/ ถ้าตัว php ไม่สามารถที่จะเขียนไฟล์ ลบไฟล์ออก หรือแค่ไฟล์ในนี้ไม่ได้จะออกอาการเอ๋อทันที
ใช้ filezilla เปลี่ยน chmod สังเกตว่าบางไฟล์มันเปลี่ยนสิทธิไม่ได้ มีปัญหา owner แล้วแน่นอน
ก็ขอข้อมูลการติดต่อทาง host จากเจ้าของเห็นชื่อก็สังหรณ์ใจทันที เป็นเจ้าของเดียวก็บโปรแกรม apple ที่มีปัญหาดราม่ากันกับกลุ่มคนทำเว็บเรื่องไม่ update โปรแกรมตัวเอง ติดต่อไปก็งานเข้าทันทีเค้าบอกว่า permission ต่างกันแล้วยังไง มันไม่มีผลอะไร แต่เค้าก็มีปุ่มให้ 2 ปุ่มวิเศษ (ทำไว้ทำไม่วะครับ) คือ

  • กดปุ๊บ จะเปลี่ยน owner ให้ทั้งโพลเดอร์ นานๆ อัพทีคงจะไม่เป็นไร เข้าไปกดมันก็ได้
  • อีกปุ่มคือ “ปล่อยผี” กดแล้วจะเปลี่ยนสิทธิทุกไฟล์เป็น 777 wtf กันเลย ไม่กลัวความปลอดภัยกันเลยใช่มั๋ย งานมันต้องเอาขึ้นแล้วก็ทนๆก่อน
    หลังจากทำทุกอย่างที่เค้าบอกมาแล้ว โปรแกรมเหมือนจะใช้ได้ ยกเว้น upload file ผ่านทาง php ไม่ได้ ดู error log
at HandleExceptions->handleError('2', 'is_executable():
open_basedir restriction in effect. File(/usr/local/php53/lib/php/) is not within the allowed path(s):
(.:/home/www/virtual/xxx/:
/usr/local/php53/lib/php/:/tmp/)',
'/home/www/virtual/xxx/cms_inside/htdocs/vendor/symfony/process/ExecutableFinder.php',
'63', array('name' => 'php', 'default' => false, 'extraDirs' => array('/usr/local/php70/bin'),
'searchPath' => array('.', '/home/www/virtual/xxx/', '/usr/local/php53/lib/php/', '/tmp/'),
'dirs' => array('.', '/home/www/virtual/xxx/'),
'path' => '/usr/local/php53/lib/php/'))

ไป search หาดูเค้าบอกกันว่า path มันไม่อยู่ใน config open_basedir ทดลองกับเครื่องตัวเองก็เป็นสาเหตุได้จริงๆ ก็ส่งอีเมล์ ไปขอให้แก้ config ให้ใหม่ใส่ /usr/local/php70/bin เพิ่มเข้าไป คุณท่านก็บอกกลับมาว่า มันไม่เกี่ยว เค้าก็เขียน php เหมือนกัน แต่ก็ยอมแก้ให้ หลังจากนั้นไฟล์ก็ี upload ได้ปกติ ชักจะเริ่มสงสัยแล้วว่า config server แล้วก็เขียนโปรแกรมเป็นจริงๆ รึเปล่า

ต่อมา เจออีกกว่าส่งอีเมล์ออกไม่ได้ เพราะว่าไป disable บางอย่างไว้ ครั้งนี้เปลี่ยน host ละไม่ไหวเจ้านี้ เลยเขียน script ไว้ตรวจเบื้องต้น รอเค้าเซ็ตไปก่อน ( เหมือน server ในไทยนี่ยังใช้อัตโนมือกันอยู่เลย ทำให้ต้องรอ 1 วันเต็ม ๆ )

<?php
echo '<br>Current script owner: ' . get_current_user();
echo '<hr>';
 
echo '<br>file upload by ftp owner = ' . fileowner('test.php');
echo '<br>file upload by ftp group = <pre>' . print_r(posix_getgrgid(filegroup('test.php')), true), '</pre>';
echo '<hr>';
 
echo '<br>file index.php owner = ' . fileowner('index.php');
echo '<br>file index.php group = <pre>' . print_r(posix_getgrgid(filegroup('index.php')), true), '</pre>';
echo '<hr>';
 
file_put_contents('testFile.php', '<?php phpinfo();');
echo '<br>create by php owner = ' . fileowner('testFile.php');
echo '<br>file upload by php group = <pre>' . print_r(posix_getgrgid(filegroup('testFile.php')), true), '</pre>';
unlink('testFile.php');

ถ้าทั้งหมดได้ user id เดียวกัน หรืออยู่ group เดียวกันก็เบาใจ แต่ไม่จำเป็นว่า group จะต้องเป็น www-data เคยเจอว่าบางที่เค้าจะสร้าง group ใหม่ให้ลูกค้าแต่ละเจ้าไปเลยเพื่อความปลอดภัย

เปลี่ยนโฮสต์เจ้าใหม่ โปรแกรมที่เขียนทำงานได้ตามปกติทุกอย่าง ลาก่อนน้องเอ๊ปเปิ๊ล อย่างลืมนะครับ เลิกใช้แอปเปิ้ลกันได้แล้ว

About the author

phunsanit administrator