Путаница с правами доступа к файлам - PullRequest
2 голосов
/ 22 октября 2011

Нашел этот бит кода в 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 ]

3 голосов
/ 22 октября 2011

Константы, на которые вы ссылаетесь (0x0080 и т. Д.), Не имеют точного значения, которое, по вашему мнению, они имеют.См. Документацию fileperms:

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

Кроме того, вы не сравниваете их, вы выполняете поразрядно И .

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

Поскольку результат не равен нулю, это означает, что конкретный файл доступен для записи владельцем.

Но что делает код, который вы даете?

Ну, он возвращает true в том и только в том случае, если файл доступен для записи любым из следующего:

  • пользователя, от имени которого запускается скрипт (провереноis_writable)
  • пользователь, которому принадлежит файл
  • группа, которой принадлежит файл
  • любой пользователь

Это, безусловно, выглядит нелогичными глючит для меня, потому что, например:

  • , если, например, только владелец может записать файл, функция вернет true;однако, это, конечно, не означает, что файл доступен для записи для вас , если вы не владелец!
  • , если целью является проверка, может ли любой написать файл(что на самом деле бессмысленно), проверка is_writable была бы излишней и, по крайней мере, сбивающей с толку.
2 голосов
/ 22 октября 2011

Откуда берется это значение?

Это шестнадцатеричные эквиваленты битов разрешения, обычно указанные в восьмеричной системе.

Это предопределенное значение для системы разрешений?

Да.

А может кто-нибудь объяснить мне, например, как $perms & 0x0080 разрешить в истину, например, fileperms(__FILE__) вернуть значение, например 33206

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

Ненулевые значения являются истинными.

...