Windows IIS : "Accès refusé" sur les fichiers uploadés par PHP

16 novembre 2020 à 08:21

Si vous utilisez IIS, vous rencontrez peut-être un problème de droit d'accès aux fichiers uploadés par PHP.

Aucun problème pour ajouter un fichier (via la fonction PHP move_uploaded_file ou via UploadedFile::move si vous utilisez Symfony), mais lorsque vous voulez copier (fonction PHP copy) ou déplacer (fonction PHP rename) le fichier en question, vous rencontrez une erreur "Accès refusé" ("Permission denied"). Pourtant, le fichier a bien été ajouté sur votre serveur !

Le problème vient de l'héritage des permissions du dossier temporaire d'upload.

Lorsque vous uploadez un fichier avec PHP, celui-ci le place dans un dossier temporaire et le déplace ensuite dans le dossier final (le dossier que vous choisissez lorsque vous appelez la fonction move_uploaded_file). Quand le fichier est placé dans le dossier temporaire, il se voit attribuer les autorisations de ce dossier temporaire. Ces autorisations ne changent pas, même après le déplacement vers le dossier final.

Comment je trouve le dossier temporaire d'upload ?

Le dossier temporaire d'upload est défini dans le fichier de configuration php.ini, sous la directive upload_tmp_dir.

Par défaut : C:\Windows\Temp (vous pouvez le vérifier avec phpinfo)

Si vous faite un clic droit sur ce dossier, puis "Propriétés", vous devriez voir dans l'onglet "Sécurité" le message suivant :

Vous devez disposer d'autorisations d'accès en lecture pour afficher les propriétés de cet objet.

Cliquez sur Avancé pour continuer.

Il faut ajouter le groupe ou le compte utilisateur utilisé par IIS (généralement IIS_IUSRS par défaut).

Pour trouver le groupe ou le compte utilisateur utilisé, rendez-vous dans le gestionnaire des services Internet (IIS) : Gestionnaire des services Internet (IIS) > Pools d'application > Colonne "Identité"