文件权限混乱

时间:2011-10-22 18:31:56

标签: 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如何解析为真,例如fileperms(__FILE__)返回一个像33206这样的值。你好吗? 将33206与0x0080进行比较?

2 个答案:

答案 0 :(得分:3)

您引用的常量(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检查将是多余的,至少令人困惑。

答案 1 :(得分:2)

  

这个值来自哪里?

它们是权限位的十六进制等效值,通常以八进制指定。

  

这是许可系统的预定值吗?

Yes.

  

有人可以向我解释一下$perms & 0x0080如何解析为true,例如fileperms(__FILE__)返回一个类似33206的值

>>> hex(33206)
'0x81b6'
>>> 0x81b6 & 0x0080
128

非零值为真。