Donner à PHP l'autorisation d'écrire dans des fichiers et des dossiers


13

MIS À JOUR POUR PLUS DE CLARTÉ:

Selon http://expressionengine.com/user_guide/installation/installation.html , il est dit:

Pour la plupart des hôtes Unix, ce qui suit est typique, mais vous pouvez vérifier auprès de votre hôte si des autorisations plus restrictives peuvent être utilisées pour permettre à PHP d'écrire dans des fichiers (666) et des dossiers (777) . Sur les serveurs Windows, les éléments suivants ne s'appliqueront pas, mais vous devrez vous assurer que les fichiers et dossiers sont accessibles en écriture par ExpressionEngine. Vous devrez peut-être contacter votre hôte pour cela.

Je ne sais pas ce que cela signifie. Je peux changer les fichiers et dossiers spécifiques en 666 et 777 respectivement où je suis le chown'er, mais ce qui précède semble que je dois également autoriser PHP à le faire?

QUESTION ORIGINALE:

Je dois m'assurer que PHP peut écrire dans des fichiers spécifiques (666) et des dossiers (777).

Comment puis-je faire cela?


2
Je ne sais pas quel problème vous essayez de résoudre? Si vous pouvez accéder au répertoire dans lequel se trouve le fichier et disposer de l'autorisation d'exécution, vous pouvez écrire dans des fichiers et des répertoires avec ces autorisations.
Karlson

Ajout de plus de détails ci-dessus.
oshirowanen

1
Pour la plupart des hôtes Unix, ce qui suit est typique, mais vous pouvez vérifier auprès de votre hôte si des autorisations plus restrictives peuvent être utilisées pour permettre à PHP d'écrire dans des fichiers (666) et des dossiers (777) - Y a-t-il un coma manquant? sinon cette phrase n'a aucun sens. À moins que le répertoire de niveau supérieur ne soit restreint, vous n'avez aucun problème à écrire dans des fichiers ou des répertoires accessibles en écriture.
Karlson

Je viens de faire un copier-coller à partir de la documentation. De plus, c'est la raison pour laquelle j'ai posté la question car je ne comprends pas ce que signifie cette citation ...
oshirowanen

1
Si vous voyez de la documentation suggérant que vous utilisez 666 ou 777 par rapport aux fichiers Web, vous devez probablement l'ignorer à moins qu'une bonne raison ne soit expliquée. C'est généralement quelque chose d'écrit par quelqu'un qui ne savait pas comment configurer les bonnes autorisations, et a abandonné et donné à tout le monde un accès en lecture ou en écriture aux fichiers.
jsbillings

Réponses:


18

Je vais compléter les réponses de rahmu et MV avec une solution technique. Tout ce qui suit n'est valable que pour les systèmes de type UNIX.

Faites défiler la section chmod / chown pour voir un exemple utilisant les ACL - un outil plus puissant que les modes de fichiers UNIX.

Trouver le nom d'utilisateur de votre serveur Web

Tout d'abord, vous devrez connaître le nom d'utilisateur sous lequel votre serveur Web s'exécute. Si vous utilisez Apache, il peut être apacheou httpd, www-dataetc. Sur la plupart des systèmes Debian comme, Apache est www-data. Pour nginx, généralement, c'est aussi le cas www-data.

Pour le vérifier, essayez:

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

Assurez-vous que le nom d'utilisateur renvoyé par cette commande est cohérent (par exemple, j'utilise nginx 99% du temps, mais cette commande renvoie tomcat7, un serveur Web Java que j'ai installé une fois) .


Octroi d'autorisations au serveur Web: utilisation de chmodetchown

Faire un chmodde 666 ou 777 (la solution incontournable pour ce genre de problèmes dans de mauvaises documentations / tutoriels) peut magiquement faire fonctionner les choses, mais n'est pas sûr. Accorder des autorisations 666 ou 777 donnera accès aux "autres". Donc pas seulement Apache, mais aussi grandmotheret nsa(à condition que ces comptes d'utilisateurs existent sur votre machine - mais non vraiment, veuillez éviter de le faire à moins que ce ne soit que pour le test / dépannage).

Il vaut mieux être plus précis et accorder des autorisations uniquement à vous et à Apache. Modifiez le groupe de vos fichiers pour donner le contrôle total sur vos fichiers au serveur Web. Pour ce faire, modifiez le propriétaire de manière récursive:

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

Mais il est fort probable que vous souhaitiez conserver un accès complet à vos fichiers en modifiant uniquement le groupe:

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

Ensuite, faites le nécessaire chmodpour accorder au groupe www-datales mêmes autorisations que vous. Par exemple, si le mode actuel est 640 (6 pour vous, 4 pour www-data, 0 pour les autres, traduisant en -rw-r -----) , définissez-le sur 660 (6 pour vous, 6 pour www- données, 0 pour les autres, se traduisant par -rw-rw ----) . Voir la réponse de rahmu pour en savoir plus sur les modes de fichiers, c'est un mécanisme ancien mais élégant.

Pour éviter de manipuler des nombres obscurs avec chmod, vous pouvez également utiliser cette syntaxe:

chmod -R g+rw your/folder/

Cela signifie "au groupe ( g), ajouter +( rw) les autorisations de lecture et d'écriture ( ) sur le dossier your/folder/, récursivement ( -R)".

Dans 90% des cas, cela devrait suffire.


Ma méthode préférée: utiliser les ACL (Access Control List)

Parfois, la première solution n'est pas suffisante. Je prendrai l'exemple de Symfony Framework qui enregistre et met en cache un grand nombre de données. Il a donc besoin d'un accès en écriture au dossier approprié.

Et la méthode chmod/ chownpeut ne pas être suffisante, lorsque vous utilisez en parallèle la console Symfony en CLI (sous mon compte utilisateur) et le Web (utilisateur du serveur Web). Cela pose beaucoup de problèmes car Symfony modifie constamment les autorisations.

Dans ce cas, nous utiliserons l'ACL (Access Control List), qui est un moyen plus avancé de gérer les autorisations sur de nombreux systèmes UNIX.

Voici les commandes données par la documentation officielle de Symfony ( veuillez changer app/cacheet app/logsselon vos besoins ):

Sur un système qui prend en charge chmod +a(c'est-à-dire pas 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

Sur un système qui ne prend pas en charge chmod +a(le plus courant)

Vous aurez besoin de l' setfacloutil; il est peut-être installé sur votre système par défaut, alors essayez setfacl -vde voir si la commande est disponible.

Si la commande n'est pas disponible et que vous utilisez Ubuntu 14.04+, vous n'aurez qu'à installer l'outil:

sudo apt install acl

Sinon, suivez la documentation de votre système d'exploitation, car vous devrez peut-être modifier la façon dont votre partition est montée ( documentation Ubuntu ici ).

Et nous y voilà:

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

Je n'ai jamais eu de problème avec cette méthode, satisfait ou remboursé.


1
+1 pour 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v racine | tête -1 | cut -d \ -f1 '
Amar Pratap

4

Peu importe qui est le propriétaire des fichiers, 666 autorisations et 777 suffiraient: le dernier chiffre garantit que chaque utilisateur du système a accès. Bien que ce soit la façon la plus simple de le faire, ce n'est certainement pas la plus sûre pour cette raison exacte.

Une meilleure façon de le faire

La première chose que vous devez comprendre est le fonctionnement des autorisations Unix . Afin de comprendre la réponse que j'ai donnée à ce lien, veuillez noter que les autorisations peuvent être traduites en chiffres:

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

A chmod 666équivaut alors à modifier les autorisations en rw-rw-rw.

Ensuite, vous devez déterminer quel est l'utilisateur qui exécute le script PHP. Normalement, ce serait l'utilisateur exécutant votre serveur Web. Voici un exemple de la façon de procéder (vous pouvez remplacer Apache par le nom de votre serveur Web).

Une fois que vous savez quel est l'utilisateur qui exécute les scripts et qui est le propriétaire des fichiers que vous mentionnez, c'est à vous de définir les autorisations appropriées. Gardez à l'esprit que donner un accès en écriture (même en lecture) à chaque utilisateur de votre système peut être potentiellement désastreux.


0

Le moteur d'expression est comme de nombreuses autres applications Web PHP qui nécessitent un accès en lecture / écriture à certains fichiers et répertoires. Par exemple, EE requiert un accès en écriture à ses fichiers config.php et database.php et un accès en écriture à ses répertoires de téléchargement de fichiers.

La documentation indique que, comme la plupart des serveurs exécutent PHP en tant que mod_php (et donc exécutent avec les autorisations du serveur Web), et comme vous téléchargerez probablement vos fichiers avec FTP (ou similaire) en utilisant votre propre utilisateur, ces fichiers et les répertoires devront recevoir les autorisations 666 (tout le monde peut lire et écrire) et 777 (tout le monde peut lire, écrire et parcourir).

Ce n'est pas le moyen le plus sûr, mais c'est certainement le plus simple, surtout si vous utilisez un service d'hébergement.

Cependant, comme l'indiquent les instructions EE, demandez à votre hébergeur, car certains n'utilisent pas mod_php mais une version fastcgi, suphp ou différente. Ces serveurs exécutent PHP en tant que votre propre utilisateur, donc tous les fichiers que vous téléchargez sont déjà lisibles et inscriptibles par PHP et par tout fichier créé par les scripts EE. Dans ce cas, les fichiers et répertoires auxquels PHP accède devraient avoir un accès de 600 et 700. Les autres fichiers accessibles directement par le serveur Web (pas le runtime PHP) auraient toujours besoin d'un accès 666 et 777).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.