2011-10-22 101 views
1

發現這段代碼中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.How值u能 與0x0080比較33206?

+0

由於權限被分組爲三元組,人們通常使用它們的八進制值。不是十六進制或小數。這可能來自可怕的手動示例。 – mario

回答

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檢查將是多餘的,至少是令人困惑的。
2

這個值來自哪裏?

它們是權限位的十六進制等效值,通常以八進制指定。

這是權限系統的預設值嗎?

Yes.

而且可以有人向我解釋,例如如何$perms & 0x0080決心如此,原因例如fileperms(__FILE__)回到像33206

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

非零值是值真正。

+0

33206是基數10? – slier

+0

這是正確的。數字默認輸出爲十進制。 –