【问题标题】:File permission confusion文件权限混乱
【发布时间】:2011-10-23 02:42:43
【问题描述】:

在 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 进行比较?

【问题讨论】:

  • 由于权限被分组为三元组,人们通常使用八进制值。不是十六进制或十进制。它可能取自糟糕的手动示例。

标签: php file-permissions


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个值是从哪里来的?

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

    这是权限系统的预定值吗?

    Yes.

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

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

    非零值为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2012-03-06
      • 2017-07-22
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多