chmod()
chmod() ist eine PHP-Funktion zum Ändern des Dateimodus, der Zugriffsrechte und Berechtigungen für Dateien und Verzeichnisse festlegt.
Die PHP-Funktion chmod() verstehen
chmod() ändert den Modus (die Berechtigungsbits) einer Datei oder eines Verzeichnisses auf einem Unix-ähnlichen Dateisystem. Der Modus steuert, wer was mit der Datei tun darf: ihren Inhalt lesen, in sie schreiben oder sie ausführen. Korrekte Berechtigungen sind sicherheitskritisch — zu freizügig und jeder kann sensible Daten lesen oder überschreiben; zu restriktiv und der Webserver kann die Dateien nicht lesen, die er ausliefern muss.
Diese Seite behandelt die Syntax, das Lesen und Schreiben des oktalen Modus, die gängigsten Berechtigungswerte, den Rückgabewert sowie typische Fallstricke (die führende Null, umask und Windows).
Syntax
chmod(string $filename, int $permissions): bool| Parameter | Beschreibung |
|---|---|
$filename | Pfad zur Datei oder zum Verzeichnis, deren Berechtigungen geändert werden sollen. |
$permissions | Der neue Modus als oktale Ganzzahl (z. B. 0644). |
Die Funktion gibt true bei Erfolg und false bei Misserfolg zurück.
Wie der oktale Modus funktioniert
Der Modus ist eine dreistellige oktale Zahl. Jede Stelle beschreibt eine Benutzerklasse:
| Stelle | Gilt für |
|---|---|
| 1. Stelle (z. B. 644) | Eigentümer der Datei |
| 2. Stelle (z. B. 644) | Gruppe |
| 3. Stelle (z. B. 644) | Andere (alle übrigen) |
Jede Stelle ist die Summe der Berechtigungen, die dieser Klasse gewährt werden:
| Wert | Berechtigung |
|---|---|
4 | Lesen |
2 | Schreiben |
1 | Ausführen |
0 | Keine |
Addition: Lesen + Schreiben = 4 + 2 = 6 und Lesen + Ausführen = 4 + 1 = 5. 0750 bedeutet also Eigentümer: lesen/schreiben/ausführen (7), Gruppe: lesen/ausführen (5), Andere: nichts (0).
In PHP muss der Modus mit einer führenden 0 geschrieben werden, damit er als oktal interpretiert wird. chmod("file.txt", 644) übergibt die dezimale Zahl 644, die dem oktalen Wert 1204 entspricht — mit ziemlicher Sicherheit nicht das Gewünschte. Schreiben Sie immer 0644.
Häufig verwendete Berechtigungswerte
| Modus | Eigentümer | Gruppe | Andere | Typische Verwendung |
|---|---|---|---|---|
0644 | lesen/schreiben | lesen | lesen | Reguläre Dateien (HTML, Bilder, Konfiguration, die der Server liest) |
0600 | lesen/schreiben | – | – | Private Dateien (Zugangsdaten, Schlüssel) |
0755 | lesen/schreiben/ausführen | lesen/ausführen | lesen/ausführen | Verzeichnisse und ausführbare Skripte |
0700 | lesen/schreiben/ausführen | – | – | Private Verzeichnisse |
0777 | alle | alle | alle | Selten sinnvoll — jeder kann lesen und überschreiben |
Beispiele
Berechtigungen für eine einzelne Datei setzen
Der Modus 0644 erlaubt dem Eigentümer Lesen und Schreiben, während Gruppe und alle anderen nur lesen dürfen:
<?php
if (chmod("example.txt", 0644)) {
echo "Permissions updated.";
} else {
echo "Failed to change permissions.";
}Ein Skript ausführbar machen
Um ein PHP-Skript direkt auszuführen (z. B. als CLI-Cron-Job), benötigt der Eigentümer die Ausführungsberechtigung:
<?php
chmod("backup.php", 0744); // owner: rwx, group & others: read onlyImmer den Rückgabewert prüfen
chmod() scheitert lautlos, indem es false zurückgibt — zum Beispiel wenn das Skript die Datei nicht besitzt. Gehen Sie nicht davon aus, dass der Aufruf erfolgreich war:
<?php
$file = "config.ini";
if (!chmod($file, 0600)) {
error_log("Could not secure {$file}");
}Fallstricke
- Eigentümerschaft ist entscheidend. Ein Prozess kann
chmod()nur für eine Datei aufrufen, die ihm gehört (oder als Superuser). Beim Shared Hosting ist der Webserver-Benutzer oft nicht der Eigentümer, sodass der Aufruffalsezurückgibt. umaskbeeinflusstchmod()nicht. Anders als beimkdir()und der Dateierstellung setztchmod()den angegebenen Modus unverändert. Dieumaskmaskiert nur neu erstellte Dateien — siehe umask().- Windows ignoriert die meisten Bits. NTFS kennt kein Unix-Berechtigungsmodell; unter Windows ist nur das Schreibschutz-Bit wirklich betroffen.
- Vor dem Ändern prüfen. Verwenden Sie is_writable(), um den Zugriff zu testen, und fileperms(), um den aktuellen Modus zu lesen, bevor Sie ihn überschreiben.
Verwandte Funktionen
- fileperms() — liest die aktuellen Berechtigungsbits einer Datei.
- is_writable() — prüft, ob das Skript in einen Pfad schreiben kann.
- umask() — setzt die Standardmaske für neu erstellte Dateien.
- mkdir() — erstellt ein Verzeichnis mit einem bestimmten Modus.
Fazit
chmod() ist Ihr Werkzeug, um den Zugriff auf Dateien und Verzeichnisse aus PHP heraus zu lockern oder zu verschärfen. Drei Regeln verhindern die meisten Fehler: Schreiben Sie den Modus oktal mit führender Null, wählen Sie die kleinstmögliche Berechtigung, die noch funktioniert (0644 für Dateien, 0755 für Verzeichnisse), und prüfen Sie den Rückgabewert, da die Funktion stillschweigend scheitert, wenn Ihr Skript die Zieldatei nicht besitzt.