fileperms
Функция возвращает информацию о правах на указанный файл или FALSE в случае возникновения ошибки.
Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache() .
Подсказка: Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url. Список упаковщиков, поддерживаемых семейством функций stat() , смотрите в Прил. M.
Пример 1. Отобразить права на файл в восьмеричном виде
echo substr(sprintf('%o', fileperms('/tmp')), -4); echo substr(sprintf('%o', fileperms('/etc/passwd')), -4);
Пример 2. Отобразить все права
$perms = fileperms('/etc/passwd'); if (($perms & 0xC000) == 0xC000) < // Сокет $info = 's'; >elseif (($perms & 0xA000) == 0xA000) < // Символическая ссылка $info = 'l'; >elseif (($perms & 0x8000) == 0x8000) < // Обычный $info = '-'; >elseif (($perms & 0x6000) == 0x6000) < // Специальный блок $info = 'b'; >elseif (($perms & 0x4000) == 0x4000) < // Директория $info = 'd'; >elseif (($perms & 0x2000) == 0x2000) < // Специальный символ $info = 'c'; >elseif (($perms & 0x1000) == 0x1000) < // Поток FIFO $info = 'p'; >else < // Неизвестный $info = 'u'; >// Владелец $info .= (($perms & 0x0100) ? 'r' : '-'); $info .= (($perms & 0x0080) ? 'w' : '-'); $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); // Группа $info .= (($perms & 0x0020) ? 'r' : '-'); $info .= (($perms & 0x0010) ? 'w' : '-'); $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); // Мир $info .= (($perms & 0x0004) ? 'r' : '-'); $info .= (($perms & 0x0002) ? 'w' : '-'); $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); echo $info;
См.также описания функций is_readable() и stat()
fileperms
Возвращает права доступа на указанный файл в числовом виде. Младшие биты этого значения такие же, как и биты прав доступа для использования в функции chmod() , однако, на большинстве платформ, возвращаемое значение будет также включать информацию о типе файла, который передан в качестве параметра filename . Примеры ниже демонстрируют как проверить возвращаемое значение на наличие определённых прав и типа файла на POSIX-системах, включая Linux и macOS.
Для локальных файлов, возвращаемое значение является частью структуры st_mode , которая возвращается функцией С-библиотеки stat() . Какие в точности биты установлены может варьироваться от платформы к платформе. Рекомендуется поискать документацию к вашей платформе, если требуется обработка битов возвращаемого значения, не относящихся к правам доступа.
Возвращает false в случае возникновения ошибки.
Ошибки
В случае неудачного завершения работы генерируется ошибка уровня E_WARNING .
Примеры
Пример #1 Отображение прав доступа в виде восьмеричного числа
echo substr ( sprintf ( ‘%o’ , fileperms ( ‘/tmp’ )), — 4 );
echo substr ( sprintf ( ‘%o’ , fileperms ( ‘/etc/passwd’ )), — 4 );
?>?php
Результат выполнения данного примера:
Пример #2 Отображение полных прав доступа
switch ( $perms & 0xF000 ) case 0xC000 : // сокет
$info = ‘s’ ;
break;
case 0xA000 : // символическая ссылка
$info = ‘l’ ;
break;
case 0x8000 : // обычный
$info = ‘r’ ;
break;
case 0x6000 : // файл блочного устройства
$info = ‘b’ ;
break;
case 0x4000 : // каталог
$info = ‘d’ ;
break;
case 0x2000 : // файл символьного устройства
$info = ‘c’ ;
break;
case 0x1000 : // FIFO канал
$info = ‘p’ ;
break;
default: // неизвестный
$info = ‘u’ ;
>
Результат выполнения данного примера:
Примечания
Замечание: Результаты этой функции кешируются. Более подробную информацию смотрите в разделе clearstatcache() .
Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми обёртками url. Список обёрток, поддерживаемых семейством функций stat() , смотрите в разделе Поддерживаемые протоколы и обёртки.
Смотрите также
- chmod() — Изменяет режим доступа к файлу
- is_readable() — Определяет существование файла и доступен ли он для чтения
- stat() — Возвращает информацию о файле
User Contributed Notes 9 notes
Don’t use substr, use bit operator
decoct ( fileperms ( $file ) & 0777 ); // return «755» for example
?>
If you want to compare permission
0755 === ( fileperms ( $file ) & 0777 );
?>
This may not be immediately apparent to some, but you can use octdec( $octal_value ) to match the permissions retrieved by file perms
//assumes file has 2770 permissions
$perm = fileperms ( __FILE__ );
$bit = «102770» ;
printf ( «%s\n» , octdec ( $bit ) );
printf ( «%s\n» , $perm );
An easy way to calculate fileperms to chmod is this:
Displays 666 or 777 (depends on chmod set).
Displays 0666 or 0777 and refers immediately to the number set with chmod();
Windows has a very different file permission model to Unix and integrates them only minimally.
Here’s how Windows calculates the bitmask.
u+w/g+w/o+w is set based on whether the file has the read only flag.
u+x/g+x/o+x is set based on whether $filename is an inherently executable file (e.g. bat) or a directory.
Windows isn’t integrating its ACLs at all.
Here is a small function I made : http://pastebin.com/iKky8Vtu
I was bored and I thought it could be useful.
mixed mkperms( string $perms [, bool return_as_string = false [, string $filename ] ] )
Returns permissions given a string in literal format and a filename.
If the file name is omitted, the permissions that the function will return are based on 000-permissions.
If return_as_string is set to true, the result will be output as a 644 format string. Otherwise it will return a string converted to base-10 for chmod.
echo mkperms ( ‘u+r’ , true ), «\n» ; // 400
echo mkperms ( ‘u+rwx,g+rw,o+x’ , true ), «\n» ; // 761
touch ( ‘myfile.txt’ ); // Create a file with any permissions
chmod ( ‘myfile.txt’ , mkperms ( ‘u=rwx,g=x,o=rw’ )); // myfile.txt is now at -rwx—xrw-
// Make a file and give it full permissions
touch ( ‘somefile.txt’ );
chmod ( ‘somefile.txt’ , 0777 );
echo mkperms ( ‘g-w,o-rw’ , true , ‘somefile.txt’ ); // 751
echo mkperms ( ‘u=rwx,g-r,o=-‘ , true , ‘somefile.txt’ ); // 730
// This way you can apply permissions to files
chmod ( ‘somefile.txt’ , mkperms ( ‘u=rwx,g-r,o=-‘ , false , ‘somefile.txt’ )); // somefile.txt is now at -rwx-wx—
?>
PS : sorry I had to put it on pastebin, or else it just made the note way too long.
A small function for the last 3 digits (777/755 ect.)
function getFilePermission ( $file ) $length = strlen ( decoct ( fileperms ( $file )))- 3 ;
return substr ( decoct ( fileperms ( $file )), $length );
>
?>
Since the output of decoct( fileperms(‘.’) ) is of the form: 40644
It seems the previous example is wrong, instead you should understand:
To get permissions formatted as «644»:
echo substr ( decoct ( fileperms ( ‘.’ ) ), 2 );
?>
To get permissions formatted as «0644»:
echo substr ( decoct ( fileperms ( ‘.’ ) ), 1 );
?>
On Linux (not tested on Windows), if you want a chmod-like permissions, you can use this function:
function file_perms ( $file , $octal = false )
if(! file_exists ( $file )) return false ;
return substr ( decoct ( $perms ), $cut );
>
?>
Using it:
$ touch foo.bar
$ chmod 0754 foo.bar
echo file_perms ( ‘foo.bar’ ); // prints: 754
echo file_perms ( ‘foo.bar’ , true ); // prints 0754
?>
Использование Nginx и php для проверки прав доступа перед отдачей файлов
Иногда на сайте возникает необходимость ограничить доступ к некоторым файлам по разным причинам(раздавать файлы только авторизованным пользователям, антилич и так далее). Для решения данной задачи можно использовать разные подходы:
- Раздавать файлы с помощью скрипта на php(заменить php на то, что нравится больше). При данном подходе мы передаем в качестве параметра скрипту имя файла. Код проверяет все условия, при которых возможно получения доступа к данному файлу и принимает решение, выдать 404 или запрошенный файл. Данный подход подходит для мелких файлов, однако при возрастании размера отдаваемого файла он будет потреблять много системных ресурсов, т.к. файл будет вычитываться в память и затем отдаваться.
- Использовать некоторые неочевидные возможности веб-серверов.
Сначала складываем наш контент в выделенные директории. В моем случае сайт расположен в /var/www, защищенный контент я выложил в /var/www/protected. Для данной секции я добавил в конфигурации nginx следующие строки:
location /protected root /var/www;
internal;
>
Здесь root указывает, где находится сайт. Директива internal указывает что данная область будет доступна только если происходит внутреннее перенаправление nginx в директорию protected. Таким образом, даже зная прямой адрес ресурса на сервере, мы будем получать 404 в ответ на наш запрос.
Первый этап завершен, контент не доступен по прямой ссылке.
Однако нам нужно при некоторых условиях данный контент все же показывать. Для этого мы приводим первый location к следующему виду:
location / rewrite ^/download/(.*) /download.php?path=$1 last;
proxy_pass 127.0.0.1/;
>
Таким образом, все запросы, которые пытаются забрать что-то из download, будут перенаправляться на файл download.php. В данном файле будет приниматься решение о разрешении/запрещении доступа пользователю к файлу. Сам исходный текст файла download.php может быть таким:
$path = $_GET[«path»];
//некоторые действия по проверке прав доступа
header(«X-Accel-Redirect: /protected/». $path);
?>
Если пользователю разрешен доступ к данному файлу, тогда отправляем данный заголовок, в ином случае отправляем ему 404. После определения прав доступа работа php завершена. Далее nginx получает данный заголовок, выполняет внутреннее перенаправление и начинает отдавать пользователю запрошенный файл.
Резюме:
Данный способ, как мне кажется будет потреблять намного меньше системных ресурсов при отдаче файлов, для которых должны проверяться права.
P.S. Данная статья не претендует на полноту и не может рассматриваться как инструкция по настройке сервера nginx. В ней сознательно опущены моменты, касательно сжатия, кэширования и тому подобных вещей.
fileperms
Возвращает права доступа к файлу в числовом формате. Младшие биты этого режима такие же, как разрешения, ожидаемые chmod () , однако на большинстве платформ возвращаемое значение также будет включать информацию о типе файла, заданном как filename . В приведенных ниже примерах показано, как проверить возвращаемое значение для определенных разрешений и типов файлов в системах POSIX, включая Linux и macOS.
Для локальных файлов конкретное возвращаемое значение — это st_mode члена st_mode структуры, возвращаемой функцией stat () библиотеки C. То, какие именно биты устанавливаются, может варьироваться от платформы к платформе, и рекомендуется поискать документацию по вашей конкретной платформе, если требуется анализ битов, не относящихся к разрешению, возвращаемого значения.
В случае ошибки возвращает false .
Errors/Exceptions
В случае сбоя E_WARNING .
Examples
Пример # 1 Отображение разрешений в виде восьмеричного числа
echo substr(sprintf('%o', fileperms('/tmp')), -4); echo substr(sprintf('%o', fileperms('/etc/passwd')), -4); ?>
Выводится приведенный выше пример:
Пример # 2 Отображение полных разрешений
$perms = fileperms('/etc/passwd'); switch ($perms & 0xF000) < case 0xC000: // socket $info = 's'; break; case 0xA000: // symbolic link $info = 'l'; break; case 0x8000: // regular $info = 'r'; break; case 0x6000: // block special $info = 'b'; break; case 0x4000: // directory $info = 'd'; break; case 0x2000: // character special $info = 'c'; break; case 0x1000: // FIFO pipe $info = 'p'; break; default: // unknown $info = 'u'; > // Owner $info .= (($perms & 0x0100) ? 'r' : '-'); $info .= (($perms & 0x0080) ? 'w' : '-'); $info .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); // Group $info .= (($perms & 0x0020) ? 'r' : '-'); $info .= (($perms & 0x0010) ? 'w' : '-'); $info .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); // World $info .= (($perms & 0x0004) ? 'r' : '-'); $info .= (($perms & 0x0002) ? 'w' : '-'); $info .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); echo $info; ?>
Выводится приведенный выше пример:
Notes
Примечание : результаты этой функции кэшируются. См. Clearstatcache () для получения более подробной информации.
Начиная с PHP 5.0.0, эту функцию также можно использовать с некоторыми оболочками URL. Обратитесь к разделу Поддерживаемые протоколы и оболочки, чтобы определить, какие оболочки поддерживают семейство функций stat () .
See Also
- chmod () — изменяет режим файла
- is_readable () — Сообщает, существует ли файл и доступен для чтения
- stat () — дает информацию о файле
PHP 8.2
(PHP 4,5,7,8)filemtime Получает модификацию Эта функция возвращает время,когда в блоки данных файла записывались данные,что содержимое было изменено.