欢迎各位兄弟 发布技术文章
这里的技术是共享的
文件权限设置为 444
(即 r--r--r--
)时,用户、组和其他用户仅有读取权限,没有写入或执行权限。但通过网页仍然能执行 test.php
,可能是以下原因导致的:
Web 服务器进程(如 www-data
、apache
或 nginx
用户)可能对文件有间接执行权限:
执行权限需求:PHP 文件通常不需要直接的文件执行权限(x
),而是需要读取权限(r
),因为 Web 服务器会读取文件内容并将其传递给 PHP 解释器(如 PHP-FPM)处理。
PHP 解释器的权限:PHP 解释器(如 php-fpm
)通常以独立用户(如 www-data
)运行,只要该用户对文件有读取权限即可。
即使文件本身没有执行权限,如果父目录有可执行权限(x
),Web 服务器仍可以访问文件内容。
目录的 x
权限允许“进入”目录并访问其内容。例如:
bashdr-xr-xr-x 3 root root 4096 Aug 18 15:57 /var/www/html
如果目录权限包含 x
,Web 服务器可以读取 test.php
。
+
符号:权限末尾的 +
(加号)表示该文件设置了额外的 ACL 规则。运行 getfacl test.php
查看是否有特定用户或组被授予额外权限(如执行权限)。
SELinux/AppArmor:某些 Linux 系统通过强制访问控制(MAC)机制允许 Web 服务器执行文件,即使传统权限为 444
。
PHP 文件通常由 Web 服务器(如 Apache/Nginx)调用 PHP 解释器处理,不需要文件本身的执行权限。执行权限由解释器进程(如 php-fpm
)持有。
检查 Web 服务器的用户:
bashps aux | grep apache # 或 nginx/php-fpm
检查文件的 ACL:
bashgetfacl test.php
检查目录权限:
bashls -ld /path/to/test.php
检查 PHP 解释器配置:
确认 PHP 处理器(如 mod_php
或 php-fpm
)正常运行。
444
权限仅表示文件可被读取,但 Web 服务器通过 PHP 解释器间接“执行”脚本时,依赖的是读取权限(r
)和目录的可访问性。
特殊配置(如 ACL、SELinux)或 Web 服务器进程的权限可能覆盖传统权限限制。
如果需要彻底禁止执行,可以:
移除读取权限(但会导致文件无法被访问)。
通过 Web 服务器配置(如 .htaccess
或 Nginx 规则)限制访问。
调整文件所有者或位置(如移动到 Web 根目录外)。