web-dev-qa-db-fra.com

Comment puis-je donner PHP accès en écriture à un répertoire?

J'essaie d'utiliser PHP pour créer un fichier, mais cela ne fonctionne pas. Je suppose que c'est parce qu'il n'a pas d'accès en écriture (c'était toujours le problème avant). J'ai essayé de vérifier si c'était le problème en créant le dossier chmod 0777, mais cela a finalement abouti à ce que chaque script de ce répertoire renvoie un message d'erreur 500 jusqu'à ce que je le modifie à nouveau . Comment puis-je donner PHP écrire l'accès à mon système de fichiers afin qu'il puisse créer un fichier?

Edit: Il est hébergé sur un hébergement partagé Hostgator à l’aide d’Apache.

Edit 2: Quelqu'un a demandé le code: Le code est un script d’image Gd. Je sais que le reste fonctionne comme je le faisais auparavant, chaque fois que je l'appelais. Maintenant, j'essaie de les créer lorsqu'un nouveau texte est ajouté et de les enregistrer dans un dossier. La ligne d'écriture que j'ai est la suivante: Imagejpeg (null, $ file, 85);

J'ai également créé un fichier test pour vérifier s'il s'agissait simplement d'un script endommagé (principalement copié à partir de tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (je ne le fais pas Je ne sais pas si/comment poster le code correctement. Voici le contenu du script PHP, moins les balises PHP.)

Il retourne 13,13,1 (lignes séparées), donc on dirait qu'il pense avoir écrit quelque chose, mais le fichier testfile.txt est vide (j'en ai téléchargé un vierge) ou inexistant (si je le supprime).

Edit 3: Le serveur exécute CentOS.

64
Leagsaidh Gordon

Un moyen très simple consiste à laisser PHP créer le répertoire lui-même.

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');

Cela vous évite les tracas avec les autorisations.

50
favo

Définissez le propriétaire du répertoire sur l'utilisateur exécutant Apache. Souvent personne sur linux

chown nobody:nobody <dirname>

De cette façon, votre dossier ne sera pas accessible en écriture au monde, mais en écriture pour Apache :)

33
Thomas Winsnes

Solution simple en 3 étapes

Résumé: Vous devez définir le propriétaire du répertoire sur l'utilisateur que PHP utilise (utilisateur du serveur Web).


Étape 1: Déterminez l'utilisateur PHP

Créez un fichier PHP contenant les éléments suivants:

<?php echo `whoami`; ?>

Téléchargez-le sur votre serveur Web. La sortie devrait ressembler à ceci:

www-data

Par conséquent, l'utilisateur PHP est www-data.


Étape 2: Déterminer le propriétaire du répertoire

Ensuite, vérifiez les détails du répertoire Web via la ligne de commande:

ls -dl /var/www/example.com/public_html/example-folder

Le résultat devrait être semblable à celui-ci:

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder

Par conséquent, le propriétaire du répertoire est exampleuser1.


Étape 3: Changez le propriétaire du répertoire en utilisateur PHP

Ensuite, changez le propriétaire du répertoire Web en utilisateur PHP:

Sudo chown -R www-data /var/www/example.com/public_html/example-folder

Vérifiez que le propriétaire du répertoire Web a été changé:

ls -dl /var/www/example.com/public_html/example-folder

Le résultat devrait être semblable à celui-ci:

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

Par conséquent, le propriétaire de example-folder a été remplacé avec succès par l'utilisateur PHP: www-data.


Terminé! PHP devrait maintenant pouvoir écrire dans le répertoire.

8
Grant Miller

1er savoir quel utilisateur possède le processus httpd en utilisant la commande suivante

ps aux | grep httpd

vous obtiendrez une réponse de plusieurs lignes comme celle-ci:

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

Ici, la 1ère colonne indique le nom d'utilisateur. Alors maintenant, vous connaissez l'utilisateur qui essaie d'écrire des fichiers, c'est-à-dire dans ce cas phpuserVous pouvez maintenant définir la permission du répertoire dans lequel votre script php tente d'écrire quelque chose:

Sudo chown phpuser:phpuser PhpCanWriteHere
Sudo chmod 755 PhpCanWriteHere
7
sowrov

Vous pouvez changer les permissions d'un dossier avec chmod () de PHP. Plus d'informations sur l'utilisation de la commande sont ici: http://php.net/manual/en/function.chmod.php

Si vous obtenez une erreur 500 lors de la définition des autorisations sur 777 (en écriture), cela signifie que votre serveur est configuré pour empêcher l'exécution de tels fichiers. Ceci est fait pour des raisons de sécurité. Dans ce cas, vous voudrez utiliser 755 comme autorisations les plus élevées sur un fichier.

Si un fichier error_log est généré dans le dossier dans lequel vous exécutez le document PHP, vous souhaiterez afficher les dernières entrées. Cela vous donnera une idée de l’échec du script.

Pour obtenir de l'aide sur la manipulation de fichier PHP, j'utilise http://www.tizag.com/phpT/filewrite.php comme ressource.

3
Ryan Gyure

J'ai découvert qu'avec HostGator, vous devez définir les fichiers sur CMOD 644 et les dossiers sur 755. Depuis que je l'ai fait en fonction de leur support technique, cela fonctionne avec HostGator

2
BSM

Meilleure façon de donner un accès en écriture à un répertoire.

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
2
pritesh

Vous pouvez définir selinux sur permissive afin d’analyser.

    # setenforce 0

Selinux se connectera mais autorisera les accès. Ainsi, vous pouvez vérifier le /var/log/audit/audit.log pour plus de détails. Peut-être aurez-vous besoin de changer de contexte selinux. En plus de cela, vous utiliserez la commande chcon. Si vous avez besoin, montrez-nous votre audit.log à une réponse plus détaillée.

N'oubliez pas d'activer selinux après avoir résolu le problème. Il vaut mieux que selinux soit appliqué. 

    # setenforce 1
2
nitishkrs

chmod ne vous permet pas de définir la propriété d'un fichier. Pour définir la propriété du fichier, vous devez utiliser la commande chown.

1
user988294

J'ai eu le même problème:

Comme j'étais peu disposé à donner 0777 à mon répertoire php, je crée un répertoire tmp avec les droits 0777, où je crée les fichiers sur lesquels je dois écrire.

Mon répertoire php continue d'être protégé. Si quelqu'un pirate le répertoire tmp, le site continue à fonctionner normalement.

1
Jorge Gutierrez

Je suis sous Ubuntu, et comme dit plus haut personne: personne ne travaille pas sur Ubuntu. Vous obtenez l'erreur:

chown: invalid group: 'nobody:nobody'

Au lieu de cela, vous devriez utiliser le 'nogroup', comme:

chown nobody:nogroup <dirname>
0
orjtor