Как проверить, запрещен ли доступ к файлу и как передать права (777) файлу в php? - PullRequest
2 голосов
/ 05 января 2010

Я работаю в PHP на Ubuntu. Когда я использую любое изображение на веб-странице, к которой был запрещен доступ, на странице появляется предупреждение. Я хочу проверить это перед отображением, и если у него нет прав на открытие, то дайте ему доступ на открытие. Как мы делаем в терминальной команде.

chmod 777 myimage.jpg

Как это проверить и дать полный доступ к файлу в php.

Спасибо

Ответы [ 5 ]

8 голосов
/ 05 января 2010

Проверьте функцию is_readable () и is_writable () .

Пример:

$filename = '/home/myuser/example.txt';

if (is_readable($filename) && is_writable($filename))
{
    echo "File has read and write permissions.";
}
2 голосов
/ 05 января 2010

Одна вещь, которую вы можете сделать, это использовать функцию fileownerposix_getpwuid) и сравнить ее с тем, кем является ваш пользователь PHP (часто www-data).

Если пользователи одинаковые, вы сможете изменить разрешения, если это необходимо. Но сначала проверьте, доступен ли файл для записи.

UPDATE: функции chmod и chown возвращают TRUE в случае успеха и FALSE в случае неудачи, поэтому было бы неплохо поместить их в предложение if. Вы можете подавить вывод ошибки, установив error_reporting(0); в начале скрипта или используя символ @, подобный следующему:

if ( @chmod($filename, 0666) ) {
    // do whatever with file
}
else if ( @chown($filename, 1000) ) {
    chmod($filename, 0666);
    // do whatever with file
}
else {
    // can't change permissions
}
2 голосов
/ 05 января 2010

Используйте is_readable () , чтобы проверить, читается ли файл процессом PHP.

Используйте chmod () , чтобы изменить права доступа к файлу.

Кроме того, вы можете использовать is_writable () для проверки возможности записи в файл и file_exists () для проверки, существует ли файл.

1 голос
/ 05 января 2010

Делать это на лету из PHP при каждой ссылке на файл - очень неэффективный способ управления вашими файлами. Также требуется, чтобы весь доступ к файлам осуществлялся через скрипт PHP. Кроме того, с точки зрения безопасности, сделать контент доступным для записи во всем мире довольно грязно.

Я бы однажды запустил скрипт администратора, чтобы привести в порядок разрешения для ваших существующих файлов, а затем исправил бы проблему, когда новые файлы попадают в систему.

Конечно, если у вас нет доступа к оболочке / доступа к оболочке от имени другого пользователя, кроме uid веб-сервера, вам придется реализовать это с помощью PHP (и, следовательно, readdir / is_readable / is_writeable).

Не зная, как файлы появляются на вашем веб-сервере, трудно порекомендовать конкретное решение.

С

0 голосов
/ 05 января 2010

Одна вещь, которую вы можете сделать, чтобы сделать файл читаемым / доступным для записи, - это вызвать эту функцию при создании файла / папки без второго аргумента:

function AutoChmod($path, $chmod = null)
{
    if (file_exists($path) === true)
    {
        if (is_null($chmod) === true)
        {
            $chmod = (is_file($path) === true) ? 644 : 755;

            if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true)
            {
                $chmod += 22;
            }
        }

        return chmod($path, octdec(intval($chmod)));
    }

    return false;
}

Пример:

AutoChmod('/path/to/file/you/just/created.txt');

Эта функция дает соответствующее разрешение независимо от того, работаете вы с SuPHP / SuExecPHP или нет.


Для проверки прав доступа достаточно использовать функции is_readable() и is_writable().

...