Zezwolenie PHP na zapisywanie plików i folderów


13

ZAKTUALIZOWANO W CELU DALSZEJ PRZEJRZYSTOŚCI:

Zgodnie z http://expressionengine.com/user_guide/installation/installation.html mówi:

W przypadku większości hostów uniksowych poniższe są typowe, ale możesz sprawdzić u swojego hosta, czy można użyć bardziej restrykcyjnych uprawnień, aby zezwolić PHP na pisanie w plikach (666) i folderach (777) . Na serwerach Windows poniższe wymagania nie będą miały zastosowania, ale musisz upewnić się, że pliki i foldery są zapisywalne przez ExpressionEngine. W tym celu może być konieczne skontaktowanie się z gospodarzem.

Nie jestem pewien, co to oznacza. Mogę zmienić określone pliki i foldery odpowiednio na 666 i 777, gdzie jestem chown'er, ale powyższe dźwięki brzmią tak, jakbym musiał pozwolić PHP to zrobić?

PYTANIE ORYGINALNE:

Muszę upewnić się, że PHP może pisać do określonych plików (666) i folderów (777).

Jak mam to zrobic?


2
Nie jestem pewien, jaki problem próbujesz rozwiązać? Jeśli masz dostęp do katalogu, w którym znajduje się plik i masz w nim uprawnienia do wykonywania, możesz pisać do plików i katalogów z tymi uprawnieniami.
Karlson,

Dodano dalsze szczegóły powyżej.
oshirowanen

1
W przypadku większości hostów uniksowych poniższe są typowe, ale możesz sprawdzić u swojego hosta, czy można użyć bardziej restrykcyjnych uprawnień, aby zezwolić PHP na zapisywanie plików (666) i folderów (777) - Czy brakuje śpiączki? w przeciwnym razie to zdanie nie ma sensu. O ile katalog wyższego poziomu nie jest ograniczony, nie ma problemu z zapisywaniem plików lub katalogów do zapisu na świecie.
Karlson,

Właśnie zrobiłem kopię i wkleiłem z dokumentacji. Ponadto jest to powód, dla którego opublikowałem pytanie, ponieważ nie rozumiem, co oznacza ten cytat ...
oshirowanen

1
Jeśli zobaczysz dokumentację sugerującą, że używasz 666 lub 777 w odniesieniu do plików internetowych, prawdopodobnie powinieneś je zignorować, chyba że istnieje uzasadniony powód. Zazwyczaj jest to coś napisanego przez kogoś, kto nie był w stanie ustalić, jak ustawić odpowiednie uprawnienia, zrezygnował i dał wszystkim dostęp do odczytu lub zapisu plików.
jsbillings

Odpowiedzi:


18

Uzupełnię odpowiedzi Rahmu i MV rozwiązaniem technicznym. Wszystko, co następuje, dotyczy tylko systemów typu UNIX.

Przewiń obok sekcji chmod / chown na przykład, używając list ACL - potężniejszego narzędzia niż tryby plików UNIX.

Znajdowanie nazwy użytkownika serwera WWW

Najpierw musisz znać nazwę użytkownika, pod którym działa twój serwer WWW. Jeśli używasz Apache, może to być apachealbo httpd, www-dataitp Na większości systemów Debian-like, Apache www-data. W przypadku Nginx też tak jest www-data.

Aby to sprawdzić, spróbuj:

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

Upewnij się, że nazwa użytkownika zwracana przez to polecenie jest spójna (na przykład używam nginx 99% czasu, ale to polecenie zwraca tomcat7, serwer WWW Java zainstalowałem raz) .


Nadawanie uprawnień serwerowi internetowemu: za pomocą chmodichown

Wykonanie chmod666 lub 777 (rozwiązanie tego typu problemów w złych dokumentacjach / samouczkach) może magicznie sprawić, że wszystko zadziała, ale jest niepewne. Przyznanie uprawnień 666 lub 777 zapewni dostęp do „innych”. Więc nie tylko Apache, ale także grandmotheri nsa(pod warunkiem, że te konta użytkowników istnieją na twoim komputerze - ale tak naprawdę, unikaj robienia tego, chyba że jest to tylko do testowania / rozwiązywania problemów).

Lepiej jest być bardziej szczegółowym i dać uprawnienia tylko Tobie i Apache. Zmień grupę plików, aby zapewnić pełną kontrolę nad plikami na serwerze internetowym. Aby to zrobić, zmień właściciela rekurencyjnie:

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

Ale najprawdopodobniej możesz chcieć zachować pełny dostęp do swoich plików, zmieniając tylko grupę:

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

Następnie wykonaj odpowiednie czynności, chmodaby dać grupie www-datatakie same uprawnienia jak Ty. Na przykład, jeśli bieżącym trybem jest 640 (6 dla ciebie, 4 dla danych www, 0 dla innych, co przekłada się na -rw-r -----) , ustaw na 660 (6 dla ciebie, 6 dla www- data, 0 dla innych, tłumacząc na -rw-rw ----) . Zobacz odpowiedź rahmu, aby dowiedzieć się więcej o trybach plików, jest to stary, ale elegancki mechanizm.

Aby uniknąć manipulowania tajemnymi liczbami chmod, możesz również użyć tej składni:

chmod -R g+rw your/folder/

Oznacza „do uprawnień grupy ( g), dodawania ( +) odczytu i zapisu ( rw) w folderze your/folder/, rekurencyjnie ( -R)”.

W 90% przypadków powinno to wystarczyć.


Moja preferowana metoda: korzystanie z list ACL (lista kontroli dostępu)

Czasami pierwsze rozwiązanie nie jest wystarczające. Weźmię przykład Symfony Framework, który rejestruje i buforuje wiele danych. Potrzebuje więc dostępu do zapisu do odpowiedniego folderu.

A chmod/ chownmetoda może nie być wystarczająca, gdy używasz równolegle z Symfony Konsola CLI (pod moim kontem użytkownika) oraz Web (użytkownika serwer WWW). Powoduje to wiele problemów, ponieważ Symfony stale modyfikuje uprawnienia.

W takim przypadku użyjemy listy kontroli dostępu (ACL), która jest bardziej zaawansowanym sposobem zarządzania uprawnieniami w wielu systemach UNIX.

Oto polecenia podane w oficjalnej dokumentacji Symfony ( zmień app/cachei app/logsstosownie do swoich potrzeb ):

W systemie, który obsługuje chmod +a(tj. Nie 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

W systemie, który nie obsługuje chmod +a(najczęściej)

Będziesz potrzebować setfaclnarzędzia; może jest domyślnie zainstalowany w twoim systemie, więc spróbuj setfacl -vsprawdzić, czy polecenie jest dostępne.

Jeśli polecenie nie jest dostępne, a używasz Ubuntu 14.04+, wystarczy zainstalować narzędzie:

sudo apt install acl

W przeciwnym razie postępuj zgodnie z dokumentacją systemu operacyjnego, ponieważ może być konieczna zmiana sposobu montowania partycji ( dokumentacja Ubuntu tutaj ).

I oto jesteśmy:

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

Nigdy nie miałem żadnych problemów z tą metodą, satysfakcji ani zwrotu pieniędzy.


1
+1 dla 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | głowa -1 | cut -d \ -f1 '
Amar Pratap

4

Bez względu na to, kto jest właścicielem plików, wystarczy 666 uprawnień i 777: ostatnia cyfra zapewnia dostęp każdemu użytkownikowi w systemie. Chociaż jest to najłatwiejszy sposób na zrobienie tego, zdecydowanie nie jest to najbezpieczniejszy z tego właśnie powodu.

Lepszy sposób na zrobienie tego

Pierwszą rzeczą, którą musisz zrozumieć, jest sposób działania uprawnień Unix . W celu zrozumienia odpowiedzi, którą podałem pod tym linkiem, proszę zauważyć, że uprawnienia można tłumaczyć na liczby:

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

A chmod 666jest wtedy równoważne zmianie uprawnień na rw-rw-rw.

Następnie musisz dowiedzieć się, który użytkownik wykonuje skrypt PHP. Zwykle byłby to użytkownik prowadzący twój serwer WWW. Oto przykład, jak to zrobić (możesz zastąpić Apache nazwą swojego serwera WWW).

Gdy dowiesz się, który użytkownik wykonuje skrypty, a kto jest właścicielem plików, o których wspomniałeś, od Ciebie zależy, czy ustawisz odpowiednie uprawnienia. Należy pamiętać, że udzielenie dostępu do zapisu (nawet odczytu) każdemu użytkownikowi w systemie może być katastrofalne.


0

Expression Engine jest tak jak wiele innych aplikacji internetowych PHP, które potrzebują dostępu do odczytu i zapisu do niektórych plików i katalogów. Na przykład EE wymaga dostępu do zapisu do swoich plików config.php i database.php oraz dostępu do zapisu do swoich katalogów przesyłania plików.

Dokumentacja stwierdza, że ​​ponieważ większość serwerów obsługuje PHP jako mod_php (a więc działa z uprawnieniami serwera WWW), i ponieważ prawdopodobnie będziesz przesyłać swoje pliki za pomocą FTP (lub podobnego) przy użyciu własnego użytkownika, te pliki i katalogi będą musiały otrzymać uprawnienia 666 (każdy może czytać i pisać) oraz 777 (każdy może czytać, pisać i przeglądać).

Nie jest to najbezpieczniejszy sposób, ale z pewnością najłatwiejszy, szczególnie jeśli korzystasz z usługi hostingowej.

Jednak, jak podają instrukcje EE, zapytaj swojego dostawcę hostingu, ponieważ niektórzy nie używają mod_php, ale fastcgi, suphp lub innej wersji. Serwery te uruchamiają PHP jako własny użytkownik, więc wszystkie przesyłane pliki są już czytelne i zapisywane przez PHP i każdy plik utworzony przez skrypty EE. W takim przypadku pliki i katalogi, do których dostęp ma PHP, musiałyby mieć dostęp 600 i 700. Inne pliki, do których dostęp miałby bezpośredni dostęp do serwera WWW (nie środowiska wykonawczego PHP) nadal wymagałyby dostępu 666 i 777).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.