在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/