簡體   English   中英

PHP即使具有777權限也需要拒絕權限,並且文件和目錄上的組必須正確

[英]PHP require Permission Denied even with 777 permissions and correct group on file + directory

當組和用戶設置正確時,PHP能夠讀取文件,我從來沒有遇到過問題。

Apache在www-data用戶下運行,因此我使用777 chmod將所有內容(組和用戶權限)設置為www-data,但仍然無法正常工作。

不知道發生了什么。

PHP不在安全模式下。

碼:

require ('/root/app/class/api.php');

文件系統:

$ pwd
/root/app/class
$ ls -la
total 76
drwxrwxrwx 2 www-data www-data  4096 Oct  8 10:59 .
drwxrwxrwx 9 www-data www-data  4096 Sep 25 21:25 ..
-rw-r--r-- 1 root     root     26896 Jan 13  2014 something_else.php
-rw-rw-r-- 1 root     root     32807 Mar 11  2015 something.php
-rwxrwxrwx 1 www-data www-data  3439 Mar  3  2015 api.php

錯誤:

Warning: require(/root/app/class/api.php): failed to open stream: Permission denied in /var/www/website.com/htdocs/app_frontend/include/config.php on line 36

Fatal error: require(): Failed opening required '/root/app/class/api.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/website.com/htdocs/app_frontend/include/config.php on line 36

嘗試調試:

error_reporting(E_ALL);
ini_set('display_errors','On');

$file = '/root/app/class/api.php';

echo sprintf ( '%o', fileperms ( $file ) ), PHP_EOL;
echo posix_getpwuid ( fileowner ( $file ) ), PHP_EOL; // Get Owner
echo posix_getpwuid ( posix_getuid () ), PHP_EOL; // Get User

if (is_file ( $file )) {
    echo "is_file", PHP_EOL;
    ;
}

if (is_readable ( $file )) {
    echo "is_readable", PHP_EOL;
    ;
}

if (is_writable ( $file )) {
    echo "is_readable", PHP_EOL;
}

fopen ( $file, "w" );

結果:

Warning: fileperms(): stat failed for /root/app/class/api.php in /var/www/website.com/...

Warning: fileowner(): stat failed for /root/app/class/api.php in /var/www/website.com/...

編輯:我的服務器上沒有啟用SElinux,這是apachectl DUMP_MODULES的輸出

$ /usr/sbin/apachectl -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)

該文件的完整路徑需要可讀才能使PHP打開。

例如:

# cd /
# ls -al
drwx------ 3 root  wheel  102 jan  1  2014 root
# sudo su
Password:
$ cd /root
$ mkdir pub
$ chmod 777 pub
$ vi pub/test.php

<?php
echo "Hi, world!";
:wq

$ chmod 666 pub/test.php
$ php -a
Interactive shell

php > include "/root/pub/test.php";
Hi, world!
php > exit
$ exit
# php -a
Interactive shell

php > include "/root/pub/test.php";
PHP Warning:  include(/root/pub/test.php): failed to open stream: Permission denied in php shell code on line 1
...

請注意,在此示例中, /root並且應該始終 僅由root可讀,可寫且可執行。

TL; DR:將文件移出/root 確保文件的完整路徑可讀。

禁用SELinux並查看結果。 如果是這種情況,只需安裝並運行一個名為SELinux故障排除程序的程序即可。

  1. 查找相關警報。
  2. 點擊故障排除
  3. 檢查列出的所有插件,然后在終端中執行建議的命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM