當您使用 posix_setuid 從 root 切換到其他使用者時,您將無法根據檔案的權限存取 root 擁有的檔案。例如,如果您更改了程序的擁有者,但仍然需要開啟一個 root 擁有且權限為 600 的檔案進行讀寫,您將會收到「權限遭拒」的錯誤訊息。
有一些方法可以做到這一點(例如 Unix Socket 或 TCP Daemon 等),但或許最簡單的方法是:
在更改程序擁有者之前開啟檔案,將檔案指標儲存在全域變數中,並在更改擁有者之後使用它。
例如,假設 /root/test_file 是一個 root:root 擁有且權限為 600 的檔案,而您正在 root 身份下執行此腳本。以下程式碼將無法運作:
<?php
posix_setgid(99);
posix_setuid(99);
$fd = fopen('/root/test_file','a');
fwrite($fd,"some test strings");
fclose();
?>
但以下程式碼可以運作:
<?php
$fd = fopen('/root/test_file','a');
posix_setgid(99);
posix_setuid(99);
fwrite($fd,"some test strings");
fclose();
?>
希望這能幫助到某些人。
[已在 CentOS 5 - Linux 2.6.x - PHP 5.2.x 上測試]