欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

-r--r--r--+ 1 root root 110 Aug 18 15:57 test.php 为什么权限是 444 , 通过网页仍然能够执行 test.php AG chatgpt 有大用 有大大用

文件权限设置为 444(即 r--r--r--)时,用户、组和其他用户仅有读取权限没有写入或执行权限。但通过网页仍然能执行 test.php,可能是以下原因导致的:


1. Web 服务器(如 Apache/Nginx)以特定用户身份运行

  • Web 服务器进程(如 www-dataapache 或 nginx 用户)可能对文件有间接执行权限

    • 执行权限需求PHP 文件通常不需要直接的文件执行权限(x),而是需要读取权限r),因为 Web 服务器会读取文件内容并将其传递给 PHP 解释器(如 PHP-FPM)处理。

    • PHP 解释器的权限:PHP 解释器(如 php-fpm)通常以独立用户(如 www-data)运行,只要该用户对文件有读取权限即可。


2. 文件所在目录的权限

  • 即使文件本身没有执行权限,如果父目录可执行权限x),Web 服务器仍可以访问文件内容。

  • 目录的 x 权限允许“进入”目录并访问其内容。例如:

    bash
    dr-xr-xr-x 3 root root 4096 Aug 18 15:57 /var/www/html

    如果目录权限包含 x,Web 服务器可以读取 test.php


3. 访问控制列表(ACL)或 SELinux/AppArmor

  • + 符号:权限末尾的 + (加号)表示该文件设置了额外的 ACL 规则。运行 getfacl test.php 查看是否有特定用户或组被授予额外权限(如执行权限)。

  • SELinux/AppArmor:某些 Linux 系统通过强制访问控制(MAC)机制允许 Web 服务器执行文件,即使传统权限为 444


4. PHP 文件作为脚本被解释执行

  • PHP 文件通常由 Web 服务器(如 Apache/Nginx)调用 PHP 解释器处理,不需要文件本身的执行权限执行权限由解释器进程(如 php-fpm)持有。


如何验证?

  1. 检查 Web 服务器的用户

    bash
    ps aux | grep apache   # 或 nginx/php-fpm
  2. 检查文件的 ACL

    bash
    getfacl test.php
  3. 检查目录权限

    bash
    ls -ld /path/to/test.php
  4. 检查 PHP 解释器配置

  • 确认 PHP 处理器(如 mod_php 或 php-fpm)正常运行。


总结

  • 444 权限仅表示文件可被读取,但 Web 服务器通过 PHP 解释器间接“执行”脚本时,依赖的是读取权限(r)和目录的可访问性

  • 特殊配置(如 ACL、SELinux)或 Web 服务器进程的权限可能覆盖传统权限限制。

如果需要彻底禁止执行,可以:

  • 移除读取权限(但会导致文件无法被访问)。

  • 通过 Web 服务器配置(如 .htaccess 或 Nginx 规则)限制访问。

  • 调整文件所有者或位置(如移动到 Web 根目录外)。


普通分类: