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

13

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

Согласно http://expressionengine.com/user_guide/installation/installation.html , говорится:

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

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

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

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

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

oshirowanen
источник
2
Я не уверен, какую проблему вы пытаетесь решить? Если вы можете получить доступ к каталогу, в котором находится файл, и у вас есть разрешение на выполнение, вы можете записывать в файлы и каталоги с этими разрешениями.
Карлсон
Добавлены подробности выше.
oshirowanen
1
Для большинства хостов Unix следующее типично, но вы можете узнать у своего хоста, можно ли использовать более ограничивающие разрешения, позволяющие PHP выполнять запись в файлы (666) и папки (777). Отсутствует ли кома? в противном случае эта фраза не имеет никакого смысла. Если каталог верхнего уровня не ограничен, у вас нет проблем с записью в доступные для записи файлы или каталоги.
Карлсон
Я просто сделал копию и вставил из документации. Плюс, это причина, по которой я разместил вопрос, так как не понимаю, что означает эта цитата ...
oshirowanen
1
Если вы видите документацию, в которой говорится, что вы используете 666 или 777 в отношении веб-файлов, вам, вероятно, следует игнорировать их, если для этого нет веских причин. Обычно это что-то, написанное кем-то, кто не мог понять, как установить правильные права доступа, и сдался и дал всем доступ для чтения или записи к файлам.
Jsbillings

Ответы:

18

Я дополню ответы Рахму и М.В. техническим решением. Все, что следует, действительно только для 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-данных, 0 для других, переводя на -rw-r -----) , установите его на 660 (6 для вас, 6 для www- данные, 0 для других, перевод на -rw-rw ----) . Посмотрите ответ Рахму, чтобы узнать больше о файловых режимах, это старый, но элегантный механизм.

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

chmod -R g+rw your/folder/

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

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


Мой предпочтительный метод: использование ACL (Access Control List)

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

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

В этом случае мы будем использовать ACL (Access Control List), который является более продвинутым способом управления разрешениями во многих системах 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

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

Морган Тувери Квиллинг
источник
1
+1 за 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | голова -1 | cut -d \ -f1 '
Амар Пратап
4

Независимо от того, кто является владельцем файлов, 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 именем вашего веб-сервера).

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

rahmu
источник
0

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).

MV.
источник