php - 文件权限困惑

标签 php file-permissions

在FrogCms中找到这段代码

function isWritable($file=null) {
  $perms = fileperms($file);
  if (is_writable($file) || ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002))
    return true;
}

我很难理解这部分

(is_writable($file) || ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002))

经过一些研究,我知道 0x0080 是所有者的权限,0x0010 是组的权限,0x0002 是其他人的权限。这个值是怎么形成的?这是权限系统的预定值吗?

有人可以向我解释一下,例如 $perms & 0x0080 如何解析为 true,因为例如 fileperms(__FILE__) 返回类似 33206 的值。你怎么能 比较 33206 和 0x0080?

最佳答案

您引用的常量(0x0080 等)并不具有您认为的确切含义。请参阅fileperms文档:

0x0080 = owner writable
0x0010 = group writable
0x0002 = world writable

此外,您不是在比较它们,而是在执行 bitwise AND .

    1000000110110110 = 33206 (dec)
    0000000010000000 = 0x80  (hex)
AND ------------------------
    0000000010000000 = result (bin)

由于结果非零,这意味着特定文件是所有者可写的。

但是您提供的代码有什么作用?

好吧,当且仅当文件可由以下任何写入时,它才返回true:

  • 脚本运行的用户(由 is_writable 检查)
  • 拥有该文件的用户
  • 拥有该文件的组
  • 任何用户

这对我来说确实看起来不合逻辑且有问题,因为例如:

  • 如果例如只有所有者才能写入该文件,该函数将返回true;但是,这当然并不意味着您可以写入该文件,除非您是所有者!
  • 如果目的是检查任何人是否可以写入该文件(这实际上毫无意义),那么is_writable检查将是多余的,至少会造成困惑.

关于php - 文件权限困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861735/

相关文章:

php - 使用 mysql 数据库中的数据在 html 表中显示给定时间的事件并发进程数

php - 即使在这个简单的表单上,AJAX 调用也不起作用

linux - Amazon Linux AMI Apache 用户和权限 Web 目录

PostgreSQL PL/PerlU 触发器问题

c++ - 使用 ofstream 打开文件时设置文件权限

c - 如何从已存在的文件中复制权限?

php - 过滤器和验证器被添加了两次

php - 运行 .ics 脚本时出现错误消息?

javascript - 从 jQuery 中读取只有一个对象的 JSON 数组的值

web-applications - 无法在 Ubuntu 上将应用程序上传到 Tomcat7