Надання дозволу PHP на запис у файли та папки


13

ОНОВЛЕНО ДЛЯ ДУШОЇ ЯСНОСТІ:

Згідно з http://expressionengine.com/user_guide/installation/installation.html , він говорить:

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

Не впевнений, що це означає. Я можу змінити конкретні файли та папки відповідно на 666 і 777 там, де я хаун'ер, але вищезгадане звучить так, як мені потрібно дозволити PHP зробити це теж?

ОРИГІНАЛЬНЕ ПИТАННЯ:

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

Як це зробити?


2
Я не впевнений, яку проблему ви намагаєтеся вирішити? Якщо ви можете отримати доступ до каталогу, де знаходиться файл, і у ньому є дозвіл на виконання, ви можете записувати у файли та каталоги з цими дозволами.
Карлсон

Додані додаткові деталі вище.
oshirowanen

1
Для більшості хостів Unix типовим є наступне, але ви можете звернутися до свого хоста, щоб перевірити, чи можна використовувати більш обмежувальні дозволи, щоб PHP дозволяв писати у файли (666) та папки (777) - Чи не вистачає кома? інакше ця фраза не має жодного сенсу. Якщо каталог обмеженого рівня не обмежений, ви не маєте жодних записів до файлів чи каталогів, що записуються у світі.
Карлсон

Я просто зробив копію та вставку з документації. Плюс, це причина, чому я розмістив запитання, оскільки не розумію, що означає ця цитата ...
oshirowanen

1
Якщо ви бачите документацію, яка передбачає, що ви використовуєте 666 або 777 стосовно веб-файлів, ви, ймовірно, повинні ігнорувати її, якщо не буде пояснено вагомих причин. Зазвичай це щось, що написав хтось, хто не міг зрозуміти, як налаштувати правильні дозволи, і відмовився та дав усім читати чи писати доступ до файлів.
jsbillings

Відповіді:


18

Я доповни відповіді 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-даних, 0 для інших, що перекладається на -rw-r -----) , встановіть його на 660 (6 для вас, 6 для www- дані, 0 для інших, що перекладається на -rw-rw ----) . Дивіться відповідь rahmu, щоб дізнатися більше про режими файлів, це старий, але елегантний механізм.

Щоб уникнути маніпулювання прихованими числами chmod, ви також можете використовувати цей синтаксис:

chmod -R g+rw your/folder/

Це означає "до групи ( g), додати +( rw) дозволу на читання і запис ( ) в папці your/folder/, рекурсивно ( -R)".

У 90% випадків цього має бути достатньо.


Мій бажаний метод: використання ACL (Список контролю доступу)

Іноді першого рішення недостатньо. Я візьму приклад Symfony Framework, який записує в журнал і кешує багато даних. Тому для запису потрібен доступ до відповідної папки.

І chmod/ chownметоду може бути недостатньо, коли ви паралельно використовуєте консоль Symfony в 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

Я ніколи не мав жодних проблем із цим методом, задоволений чи повернув гроші.


1
+1 для 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v корінь | голова -1 | cut -d \ -f1 '
Амар Пратап

4

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

Кращий спосіб зробити це

Перше, що вам потрібно зрозуміти, - це як працюють дозволи на Unix . З метою розуміння відповіді, яку я дав за цим посиланням, зауважте, що дозволи можна перекласти на номери:

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

А chmod 666потім еквівалентно зміні дозволів на rw-rw-rw.

Далі ви повинні з'ясувати, хто саме користувач виконує скрипт PHP. Зазвичай це буде користувач, який працює на вашому веб-сервері. Ось приклад того, як це зробити (ви можете замінити Apache на ім'я вашого веб-сервера).

Коли ви дізнаєтесь, хто користувач виконує скрипти, а хто власник файлів, які ви згадуєте, вам належить встановити відповідні дозволи. Майте на увазі, що надання доступу до запису (навіть для читання) кожному користувачеві у вашій системі може бути потенційно згубним.


0

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

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

Це не найбезпечніший спосіб, але, звичайно, найпростіший, особливо якщо ви використовуєте хостинг-сервіс.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.