PHP rename() 忽略权限?

标签 php apache ubuntu-11.04

环境

  • PHP -V 输出: PHP 5.3.5-1ubuntu7.2 与 Suhosin-Patch (cli)(构建时间:2011 年 5 月 2 日 23:00:17) 版权所有 (c) 1997-2009 PHP Group Zend Engine v2.3.0,版权所有 (c) 1998-2010 Zend Technologies
  • cat/etc/issue 输出: Ubuntu 11.04
  • Apache2 -V 输出: 服务器版本:Apache/2.2.17 (Ubuntu) 服务器构建时间:2011 年 9 月 1 日 09:31:14
  • 浏览器关于输出: Firefox 6.0.2

PS -AUX 输出

root      2943  0.0  0.3 206420 12428 ?        Ss   Sep19   0:20 /usr/sbin/apache2 -k start
www-data 18658  0.0  0.2 208552 11096 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18659  0.0  0.3 208976 12036 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18660  0.0  0.3 210532 12476 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18661  0.0  0.3 210276 11820 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 18662  0.0  0.2 206948 10236 ?        S    Sep25   0:00 /usr/sbin/apache2 -k start
www-data 20037  0.0  0.3 208976 12128 ?        S    08:22   0:00 /usr/sbin/apache2 -k start
www-data 20039  0.0  0.3 209132 11748 ?        S    08:23   0:00 /usr/sbin/apache2 -k start
www-data 20120  0.0  0.3 209004 12000 ?        S    09:04   0:00 /usr/sbin/apache2 -k start

文件权限

drwxr-xr-x 2 www-data www-data   4096 2011-09-26 15:24 .
drwxr-xr-x 4 www-data www-data   4096 2011-08-26 11:31 ..
-rw-r--r-- 1 root     root     161976 2011-08-26 16:26 market.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test1.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test2.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test3.txt
-rw-r--r-- 1 root     root          0 2011-09-26 14:55 test4.txt
-rw-r--r-- 1 root     root          0 2011-09-26 15:02 test5.txt

代码

rename($file, "$dest/$file");

问题

当我对上面“文件权限”部分中列出的文件运行上述代码时,它会正确地将文件从当前位置移动到新位置并删除原始位置。当 apache2 作为 www-data 运行并且文件由 root 用户拥有并且非 root 用户只有读取访问权限时,这怎么可能?在 PHP 文档中它说:

Warnings may be generated if the destination filesystem doesn't permit chown() or chmod() system calls to be made on files — for example, if the destination filesystem is a FAT filesystem.

rename() 在此过程中是否调用这些系统函数?如果是这样,为什么?无论如何,这并不重要,因为 www-data 无论如何都不应该能够 chown/chmod root 拥有的文件。

谁能向我解释一下这是怎么发生的?

其他信息

  • 我已经使用 root 和 www-data 拥有的 PHP 脚本尝试过此操作,并且它有效。

我尝试提供尽可能多的相关信息,但如果您需要其他信息,请告诉我。

最佳答案

移动不会“删除”原始文件,除非移动是跨文件系统边界进行的。在单个文件系统中,移动只是重写相关的目录条目,因此看起来您已经复制/删除了该文件,但您所做的只是一些内务处理。由于 www-data 拥有相关目录,因此它可以根据需要重写代表这些文件的目录条目,而永远不会触及实际文件。

关于PHP rename() 忽略权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560502/

相关文章:

javascript - 从服务器拉取消息并在客户端渲染

php - 阻止非 JavaScript 用户的访问

apache - htaccess重写麻烦

Ubuntu 11.04 中的 Android 虚拟设备 (AVD) 问题

c++ - 如何在另一台计算机(linux)上使用 OpenCV 运行 C++ 库?

javascript - 使用 PHP 和 AJAX 的 Mysql UPDATE,无法更新数据库

PHP 处理 fatal error ,并将它们存储在文件中

php - UTF-8贯穿始终

apache - 是什么限制了具有大量线程的 Apache 配置的性能?

linux - netcat 和 videolan