chmod()
chmod() est une fonction PHP pour modifier le mode d'un fichier ou dossier. Elle contrôle les permissions d'accès en lecture, écriture et exécution.
Comprendre la fonction PHP chmod()
chmod() modifie le mode (les bits de permission) d'un fichier ou d'un répertoire sur un système de fichiers de type Unix. Le mode contrôle qui peut faire quoi avec le fichier : lire son contenu, y écrire ou l'exécuter. Définir correctement les permissions est essentiel pour la sécurité — trop permissives et n'importe qui peut lire ou écraser des données sensibles ; trop restrictives et votre serveur web ne peut pas lire les fichiers qu'il doit servir.
Cette page couvre la syntaxe, comment lire et écrire le mode octal, les valeurs de permission les plus courantes, la valeur de retour, et les pièges qui font trébucher les développeurs (le zéro initial, umask, et Windows).
Syntaxe
chmod(string $filename, int $permissions): bool| Paramètre | Description |
|---|---|
$filename | Chemin vers le fichier ou le répertoire dont vous souhaitez modifier les permissions. |
$permissions | Le nouveau mode, sous forme d'entier octal (par exemple 0644). |
La fonction retourne true en cas de succès et false en cas d'échec.
Comment fonctionne le mode octal
Le mode est un nombre octal à trois chiffres. Chaque chiffre décrit une classe d'utilisateurs :
| Position du chiffre | S'applique à |
|---|---|
| 1er (ex. 644) | Propriétaire du fichier |
| 2ème (ex. 644) | Groupe |
| 3ème (ex. 644) | Autres (tout le monde) |
Chaque chiffre est la somme des permissions accordées à cette classe :
| Valeur | Permission |
|---|---|
4 | Lecture |
2 | Écriture |
1 | Exécution |
0 | Aucune |
Additionnez-les : lecture + écriture = 4 + 2 = 6, et lecture + exécution = 4 + 1 = 5. Ainsi, 0750 signifie propriétaire : lecture/écriture/exécution (7), groupe : lecture/exécution (5), autres : rien (0).
En PHP, le mode doit être écrit avec un 0 initial pour être interprété comme octal. chmod("file.txt", 644) transmet le nombre décimal 644, qui correspond à la valeur octale 1204 — ce n'est presque certainement pas ce que vous souhaitez. Écrivez toujours 0644.
Valeurs de permission courantes
| Mode | Propriétaire | Groupe | Autres | Utilisation typique |
|---|---|---|---|---|
0644 | lecture/écriture | lecture | lecture | Fichiers ordinaires (HTML, images, config lue par le serveur) |
0600 | lecture/écriture | – | – | Fichiers privés (identifiants, clés) |
0755 | lecture/écriture/exécution | lecture/exécution | lecture/exécution | Répertoires et scripts exécutables |
0700 | lecture/écriture/exécution | – | – | Répertoires privés |
0777 | tout | tout | tout | Rarement une bonne idée — n'importe qui peut lire et écraser |
Exemples
Définir les permissions d'un fichier
Le mode 0644 permet au propriétaire de lire et d'écrire, tandis que le groupe et les autres ne peuvent que lire :
<?php
if (chmod("example.txt", 0644)) {
echo "Permissions updated.";
} else {
echo "Failed to change permissions.";
}Rendre un script exécutable
Pour exécuter directement un script PHP (par exemple une tâche cron en ligne de commande), le propriétaire a besoin de la permission d'exécution :
<?php
chmod("backup.php", 0744); // owner: rwx, group & others: read onlyToujours vérifier la valeur de retour
chmod() échoue silencieusement en retournant false — par exemple quand le script ne possède pas le fichier. Ne supposez pas que l'appel a réussi :
<?php
$file = "config.ini";
if (!chmod($file, 0600)) {
error_log("Could not secure {$file}");
}Pièges à éviter
- La propriété compte. Un processus ne peut faire
chmod()que sur un fichier dont il est propriétaire (ou en tant que superutilisateur). Sur un hébergement mutualisé, l'utilisateur du serveur web n'est souvent pas le propriétaire, donc l'appel retournefalse. umaskn'affecte paschmod(). Contrairement àmkdir()et à la création de fichiers,chmod()définit exactement le mode demandé.umaskne s'applique qu'aux fichiers nouvellement créés — voir umask().- Windows ignore la plupart des bits. NTFS n'a pas de modèle de permission Unix, donc sous Windows seul le bit lecture seule est significativement affecté.
- Vérifiez avant de modifier. Utilisez is_writable() pour tester l'accès, et fileperms() pour lire le mode actuel avant de l'écraser.
Fonctions associées
- fileperms() — lire les bits de permission actuels d'un fichier.
- is_writable() — tester si le script peut écrire dans un chemin.
- umask() — définir le masque par défaut appliqué aux fichiers nouvellement créés.
- mkdir() — créer un répertoire avec un mode donné.
Conclusion
chmod() est votre outil pour renforcer ou assouplir l'accès aux fichiers et répertoires depuis PHP. Retenez les trois règles qui évitent la plupart des bugs : écrivez le mode en octal avec un zéro initial, choisissez la permission minimale qui fonctionne encore (0644 pour les fichiers, 0755 pour les répertoires), et vérifiez la valeur de retour car la fonction échoue silencieusement quand votre script ne possède pas la cible.