Предоставление PHP разрешения на запись в файлы и папки

Предоставление PHP разрешения на запись в файлы и папки

ОБНОВЛЕНО ДЛЯ ДОПОЛНИТЕЛЬНОЙ ЯСНОСТИ:

В соответствии сhttp://expressionengine.com/user_guide/installation/installation.html, там говорится:

Для большинства хостов Unix типично следующее, но вы можете уточнить у своего хостера, можно ли использовать более строгие разрешенияразрешить PHP записывать в файлы (666) и папки (777). На серверах Windows следующее не будет применяться, но вам нужно будет убедиться, что файлы и папки доступны для записи в ExpressionEngine. Возможно, вам придется связаться с вашим хостом для этого.

Не уверен, что это значит. Я могу изменить определенные файлы и папки на 666 и 777 соответственно, где я chown'er, но вышеизложенное звучит так, будто мне нужно разрешить PHP делать это тоже?

ОРИГИНАЛЬНЫЙ ВОПРОС:

Мне нужно убедиться, что PHP может записывать данные в определенные файлы (666) и папки (777).

Как мне это сделать?

решение1

Я дополню ответы rahmu и MV техническим решением. Все, что следует, справедливо только для UNIX-подобных систем.

Прокрутите раздел chmod/chown, чтобы увидеть пример использования ACL — более мощного инструмента, чем файловые режимы UNIX.

Поиск имени пользователя вашего веб-сервера

Во-первых, вам нужно знать имя пользователя, под которым работает ваш веб-сервер. Если вы используете Apache, это может быть apacheили httpd, www-data, и т. д. В большинстве систем, подобных Debian, Apache — это www-data. Для nginx, как правило, это также www-data.

Чтобы проверить это, попробуйте:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

Убедитесь, что имя пользователя, возвращаемое этой командой, является корректным.(например, я использую nginx в 99% случаев, но эта команда возвращает tomcat7, веб-сервер Java, который я когда-то установил).


Предоставление разрешений веб-серверу: с помощью chmodиchown

Выполнение chmod666 или 777 (стандартное решение для такого рода проблем в плохих документах/руководствах) может волшебным образом заставить все работать, но это небезопасно. Предоставление разрешений 666 или 777 даст доступ "другим". Так что не только Apache, но также grandmotherи nsa(при условии, что эти учетные записи пользователей существуют на вашей машине - но нет, пожалуйста, избегайте этого, если только это не просто для тестирования/устранения неполадок).

Лучше быть более конкретным и дать разрешения только вам и Apache. Измените группу ваших файлов, чтобы предоставить полный контроль над вашими файлами веб-серверу. Для этого измените владельца рекурсивно:

chown -R www-data:www-data your/folder/

Но, скорее всего, вы захотите сохранить полный доступ к своим файлам, изменив только группу:

chown -R yourusername:www-data your/folder/

Затем сделайте соответствующее, chmodчтобы предоставить группе www-dataте же разрешения, что и вам. Например, если текущий режим — 640(6 для вас, 4 для www-data, 0 для других, что переводится как -rw-r-----), установите его на 660(6 для вас, 6 для www-data, 0 для других, что переводится как -rw-rw----). См. ответ rahmu, чтобы узнать больше о режимах файлов, это старый, но элегантный механизм.

Чтобы избежать манипуляций с загадочными числами с помощью chmod, вы также можете использовать следующий синтаксис:

chmod -R g+rw your/folder/

Это означает «группе ( g), добавить ( +) права на чтение и запись ( rw) для папки your/folder/, рекурсивно ( -R)».

В 90% случаев этого должно быть достаточно.


Мой предпочтительный метод: использование ACL (списка контроля доступа)

Иногда первого решения недостаточно. Я возьму примерФреймворк Symfonyкоторый регистрирует и кэширует много данных. Поэтому ему нужен доступ на запись в соответствующую папку.

И метод chmod/ chownможет быть недостаточным, когда вы используете параллельно Symfony Console в CLI (под моей учетной записью пользователя) и Web (пользователь веб-сервера). Это вызывает много проблем, поскольку Symfony постоянно изменяет разрешения.

В этом случае мы будем использовать ACL (список контроля доступа), который представляет собой более продвинутый способ управления разрешениями во многих системах UNIX.

Вот команды, приведенные в официальной документации Symfony (пожалуйста, измените app/cacheи app/logsв соответствии с вашими потребностями):

В системе, которая поддерживает chmod +a(т.е. не Debian/Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

В системе, которая не поддерживает chmod +a(наиболее распространено)

Вам понадобится этот setfaclинструмент; возможно, он установлен в вашей системе по умолчанию, поэтому попробуйте setfacl -vпроверить, доступна ли эта команда.

Если команда недоступна,ивы используете Ubuntu 14.04+, вам просто нужно установить инструмент:

sudo apt install acl

В противном случае следуйте документации вашей ОС, поскольку вам может потребоваться изменить способ монтирования раздела (Документация Ubuntu здесь).

И вот мы здесь:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

У меня никогда не возникало проблем с этим методом, я остался доволен и мне вернули деньги.

решение2

Независимо от того, кто является владельцем файлов, разрешений 666 и 777 будет достаточно: последняя цифра гарантирует, чтокаждыйпользователь в системе имеет доступ. Хотя это самый простой способ сделать это, он определенно не самый безопасный именно по этой причине.

Лучший способ сделать это

Первое, что вам нужно понять, этокак работают разрешения Unix. В интересах понимания ответа, который я дал по этой ссылке, обратите внимание, что разрешения можно преобразовать в числа:

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

Тогда A chmod 666эквивалентно изменению разрешений на rw-rw-rw.

Далее вам нужно выяснить, какой пользователь выполняет PHP-скрипт. Обычно это пользователь, который запускает ваш веб-сервер.Вот пример того, как это сделать.(вы можете заменить Apache на имя вашего веб-сервера).

Как только вы узнаете, какой пользователь выполняет скрипты, и кто является владельцем упомянутых вами файлов, вам нужно установить соответствующие разрешения. Помните, что предоставление доступа на запись (даже на чтение)каждыйпользователь в вашей системе может иметь потенциально катастрофические последствия.

решение3

Expression Engine — это как и многие другие веб-приложения PHP, которым требуется доступ на чтение и запись к некоторым файлам и каталогам. Например, EE требует доступ на запись к своим файлам config.php и database.php, а также доступ на запись к своим каталогам загрузки файлов.

В документации говорится, что поскольку большинство серверов запускают PHP как mod_php (и, следовательно, работают с разрешениями веб-сервера), и поскольку вы, вероятно, будете загружать свои файлы по FTP (или аналогичному протоколу) под своим собственным пользователем, этим файлам и каталогам необходимо будет предоставить разрешения 666 (все могут читать и писать) и 777 (все могут читать, писать и просматривать).

Это не самый безопасный способ, но, безусловно, самый простой, особенно если вы пользуетесь услугами хостинга.

Однако, как указано в инструкциях EE, обратитесь к своему хостинг-провайдеру, поскольку некоторые используют не mod_php, а fastcgi, suphp или другую версию. Эти серверы запускают PHP от вашего имени, поэтому все загружаемые вами файлы уже доступны для чтения и записи PHP и любым файлом, созданным скриптами EE. В этом случае файлам и каталогам, к которым обращается PHP, необходимо предоставить доступ 600 и 700. Другим файлам, к которым должен обращаться напрямую веб-сервер (не среда выполнения PHP), по-прежнему необходимо предоставить доступ 666 и 777).

Связанный контент