Dare il permesso a PHP di scrivere su file e cartelle


13

AGGIORNATO PER ULTERIORE CHIARITÀ:

Secondo http://expressionengine.com/user_guide/installation/installation.html , dice:

Per la maggior parte degli host Unix è tipico quanto segue, ma è possibile verificare con l'host se è possibile utilizzare autorizzazioni più restrittive per consentire a PHP di scrivere su file (666) e cartelle (777) . Sui server Windows non si applicherà quanto segue, ma sarà necessario assicurarsi che i file e le cartelle siano scrivibili da ExpressionEngine. Potrebbe essere necessario contattare l'host per questo.

Non sono sicuro del significato. Posso cambiare i file e le cartelle specifici rispettivamente a 666 e 777 dove sono io il chown'er, ma quanto sopra sembra che devo consentire a PHP di fare anche questo?

DOMANDA ORIGINALE:

Devo assicurarmi che PHP possa scrivere su file specifici (666) e cartelle (777).

Come faccio a fare questo?


2
Non sono sicuro di quale problema stai cercando di risolvere? Se è possibile accedere alla directory in cui si trova il file e disporre dell'autorizzazione di esecuzione, è possibile scrivere su file e directory con tali autorizzazioni.
Karlson,

Aggiunti ulteriori dettagli sopra.
oshirowanen,

1
Per la maggior parte degli host Unix è tipico quanto segue, ma è possibile verificare con l'host se è possibile utilizzare autorizzazioni più restrittive per consentire a PHP di scrivere su file (666) e cartelle (777) - Manca un coma? altrimenti questa frase non ha alcun senso. A meno che la directory di livello superiore non sia limitata, non hai problemi a scrivere su file o directory scrivibili dal mondo.
Karlson,

Ho appena fatto una copia e incolla dalla documentazione. Inoltre, è il motivo per cui ho pubblicato la domanda perché non capisco cosa significhi quella citazione ...
oshirowanen

1
Se vedi la documentazione che suggerisce che usi 666 o 777 in relazione ai file web, probabilmente dovresti ignorarlo a meno che non ci sia una buona ragione spiegata. Di solito è qualcosa scritto da qualcuno che non è riuscito a capire come impostare le autorizzazioni giuste e ha rinunciato e ha dato a tutti l'accesso in lettura o scrittura ai file.
jsbillings,

Risposte:


18

Completerò le risposte di Rahmu e MV con una soluzione tecnica. Tutto ciò che segue è valido solo per sistemi simili a UNIX.

Scorri la sezione chmod / chown per un esempio usando gli ACL, uno strumento più potente delle modalità file UNIX.

Individuazione del nome utente del server Web

Innanzitutto, dovrai conoscere il nome utente con cui viene eseguito il tuo server web. Se si utilizza Apache, può essere apacheo httpd, www-dataecc Sulla maggior parte dei Debian-come i sistemi, Apache è www-data. Per nginx, in genere, lo è anche www-data.

Per provarlo, prova:

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

Assicurarsi che il nome utente restituito da questo comando sia coerente (ad esempio, utilizzo nginx il 99% delle volte, ma questo comando restituisce tomcat7un server Web Java che ho installato una volta) .


Concedere autorizzazioni al server Web: utilizzando chmodechown

Fare un chmod666 o 777 (la soluzione ideale per quel tipo di problemi in documentazioni / tutorial sbagliati) può magicamente far funzionare le cose, ma è insicuro. Dare autorizzazioni 666 o 777 darà accesso ad "altri". Quindi non solo Apache, ma anche grandmothere nsa(purché esistano quegli account utente sul tuo computer - ma no davvero, per favore evita di farlo a meno che non sia solo per test / risoluzione dei problemi).

È meglio essere più specifici e dare autorizzazioni solo a te e Apache. Cambia il gruppo dei tuoi file per dare il pieno controllo dei tuoi file al web server. Per fare ciò, modificare il proprietario in modo ricorsivo:

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

Ma molto probabilmente, potresti voler mantenere pieno accesso ai tuoi file cambiando solo il gruppo:

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

Quindi, fai quanto è appropriato chmodper dare al gruppo www-datale stesse autorizzazioni di te. Ad esempio, se la modalità corrente è 640 (6 per te, 4 per www-data, 0 per altri, traducendo in -rw-r -----) , impostalo su 660 (6 per te, 6 per www- dati, 0 per gli altri, traducendo in -rw-rw ----) . Vedi la risposta di Rahmu per saperne di più sulle modalità dei file, è un meccanismo vecchio, ma elegante.

Per evitare di manipolare i numeri arcani con chmod, puoi anche usare questa sintassi:

chmod -R g+rw your/folder/

Significa "per il gruppo ( g), aggiungere +( rw) autorizzazioni di lettura e scrittura ( ) sulla cartella your/folder/, ricorsivamente ( -R)".

Nel 90% dei casi, questo dovrebbe essere sufficiente.


Il mio metodo preferito: usare ACL (Access Control List)

A volte la prima soluzione non è sufficiente. Prenderò l'esempio di Symfony Framework che registra e memorizza nella cache molti dati. Quindi ha bisogno dell'accesso in scrittura alla cartella appropriata.

E il metodo chmod/ chownpotrebbe non essere sufficiente, quando si utilizzano in parallelo Symfony Console in CLI (sotto il mio account utente) e il Web (utente del server Web). Ciò causa molti problemi perché Symfony modifica costantemente i permessi.

In questo caso, utilizzeremo ACL (Access Control List), che è un modo più avanzato per gestire le autorizzazioni su molti sistemi UNIX.

Ecco i comandi forniti dalla documentazione ufficiale di Symfony (per favore cambia app/cachee app/logssecondo le tue esigenze ):

Su un sistema che supporta chmod +a(es. Non 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

Su un sistema che non supporta chmod +a(il più comune)

Avrai bisogno dello setfaclstrumento; forse è installato sul tuo sistema per impostazione predefinita, quindi prova setfacl -va vedere se il comando è disponibile.

Se il comando non è disponibile e stai utilizzando Ubuntu 14.04+, dovrai solo installare lo strumento:

sudo apt install acl

Altrimenti, segui la documentazione del tuo SO, perché potresti dover cambiare il modo in cui è montata la tua partizione ( qui la documentazione di Ubuntu ).

Ed eccoci qui:

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

Non ho mai avuto problemi con questo metodo, soddisfatto o rimborsato.


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

4

Non importa chi sia il proprietario dei file, 666 autorizzazioni e 777 sarebbero sufficienti: l'ultima cifra si assicura che ogni utente sul sistema abbia accesso. Sebbene questo sia il modo più semplice per farlo, non è sicuramente il più sicuro per quel motivo esatto.

Un modo migliore per farlo

La prima cosa che devi capire è come funzionano le autorizzazioni Unix . Nell'interesse di comprendere la risposta che ho dato a questo link, si noti che le autorizzazioni possono essere tradotte in numeri:

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

A chmod 666equivale quindi a modificare le autorizzazioni in rw-rw-rw.

Successivamente devi capire qual è l'utente che sta eseguendo lo script PHP. Normalmente sarebbe l'utente che esegue il tuo server web. Ecco un esempio di come eseguire questa operazione (puoi sostituire Apache con il nome del tuo server Web).

Una volta che sai quale è l'utente che esegue gli script e qual è il proprietario dei file che menzioni, spetta a te impostare le autorizzazioni appropriate. Tieni presente che dare l'accesso in scrittura (anche in lettura) a tutti gli utenti del tuo sistema può essere potenzialmente disastroso.


0

Expression Engine è come molte altre applicazioni Web PHP che richiedono l'accesso in lettura e scrittura ad alcuni file e directory. Ad esempio, EE richiede l'accesso in scrittura ai suoi file config.php e database.php e l'accesso in scrittura alle sue directory di caricamento dei file.

Ciò che la documentazione afferma è che, poiché la maggior parte dei server esegue PHP come mod_php (e quindi funziona con le autorizzazioni del server Web), e come probabilmente caricherai i tuoi file con FTP (o simili) usando il tuo utente, quei file e le directory dovranno disporre delle autorizzazioni 666 (tutti possono leggere e scrivere) e 777 (tutti possono leggere, scrivere e navigare).

Questo non è il modo più sicuro, ma sicuramente è il più semplice, specialmente se stai utilizzando un servizio di hosting.

Tuttavia, come indicato nelle istruzioni EE, chiedi al tuo provider di hosting, perché alcuni non usano mod_php ma un fastcgi, suphp o una versione diversa. Quei server eseguono PHP come il tuo utente, quindi tutti i file che carichi sono già leggibili e scrivibili da PHP e da qualsiasi file creato dagli script EE. In tal caso i file e le directory a cui accede PHP dovrebbero avere accesso 600 e 700. Altri file a cui è possibile accedere direttamente dal server Web (non il runtime PHP) necessiterebbero comunque dell'accesso 666 e 777).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.