J'ai un script PHP grâce auquel je peux télécharger un fichier et j'essaie de le déplacer de /tmp vers test/ (le chemin relatif, situé dans le dossier de mon projet, par exemple /var/www/html/myproject/test serait absolu chemin). Lorsque cela se produit, j'obtiens l'erreur suivante.
move_uploaded_file(test/test.csv) : Impossible d'ouvrir le flux : autorisation refusée sur /var/www/html/myproject/import.php, ligne .php
Ce script est exécuté par l'utilisateur Apache, qui est propriétaire de /test (le propriétaire Apache et le groupe Apache possèdent ce répertoire), avec les autorisations rwx.
J'ai vérifié les éléments suivants :
- safe_mode est désactivé.
- open_basedir n'est pas défini.
- file_uploads est activé.
- upload_max_filesize est de 2 Mo, la taille du fichier est d'environ 50 Ko.
- post_max_size est de 8 Mo et mes requêtes POST ne sont pas proches de cela.
- Utilisez des chemins absolus au lieu de chemins relatifs.
- is_dir("test/") renvoie vrai.
- is_writable("test/") renvoie false.
- Dans le script php : propriétaire du fichier d'impression (fichier à déplacer), propriétaire du dossier (test/), autorisations du fichier et autorisations du dossier. Le propriétaire du fichier/dossier est affiché comme Apache. Les autorisations sur les fichiers sont de 600, le propriétaire peut donc lire et écrire. Les autorisations du dossier sont de 755, le propriétaire peut donc lire, écrire et exécuter.
- ps -aux grep apache. Faites correspondre le PID dans le journal des erreurs Apache à un processus en cours d'exécution appartenant à l'utilisateur Apache. Cela confirme donc que le processus s'exécute sous Apache.
- getcwd() et
__DIR__
renvoient tous deux le bon répertoire /var/www/html/myproject.
- dirname(
__FILE__
) renvoie le chemin absolu correct vers le fichier
- Vérifiez que file_exists($_FILES['file']['tmp_name']) renvoie vrai
- La vérification de $_FILES['file']['error'] (le fichier que je souhaite déplacer) renvoie 0, pas de problème de téléchargement.
- Utilisez is_writable("/tmp") pour vérifier si le dossier source (/tmp) est accessible en écriture et renvoie true.
- J'ai essayé d'utiliser temporairement chmod -R 777 sur test/, affiche toujours l'autorisation refusée et non accessible en écriture.
- Antivirus/EDR temporairement désactivé
- Vérifiez le contexte de sécurité de "test/". Le résultat renvoyé est : "unconfined_u:object_r:httpd_sys_content_t:s0". Rien de tout cela n'est un problème (expliqué dans la réponse ci-dessous).
- Vérifiez si vous avez installé des applications liées à la sécurité susceptibles de bloquer le déplacement de fichiers. Ces applications ne sont pas installées : AppArmor, grsecurity, Tomoyo Linux et Smack.
- Utilisation des fonctions fopen()/flock() dans le script php pour confirmer que le fichier que je souhaite déplacer n'est pas verrouillé.
- L'utilisation de la fonction is_uploaded_file() a confirmé que j'essayais de déplacer un fichier téléchargé (je devenais fou à ce stade en essayant tout ce à quoi je pouvais penser). Bien sûr, cela revient vrai.
move_uploaded_file nécessite deux paramètres. 1 : Le fichier que vous souhaitez télécharger 2 : Placer le chemin absolu du fichier 3 : Veuillez vous assurer que le répertoire de téléchargement dispose de la propriété et des autorisations appropriées (Remarque : si vous utilisez Apache comme proxy, la propriété du répertoire doit appartenir à l'utilisateur : groupe d'Apache2).
Lire la suite : https://www.php.net/manual/pt_BR/function.move-uploaded-file.php