Die Funktion chmod() ändert die Zugriffsrechte einer Datei oder eines Verzeichnisses auf einem Linux- oder Unix-Server. Das ist zum Beispiel nötig, wenn ein Upload-Verzeichnis beschreibbar gemacht oder ein Script ausführbar gesetzt werden soll.
Syntax und Oktalschreibweise
chmod() erwartet zwei Parameter: den Dateipfad und die gewünschten Rechte als Oktalzahl. Die Oktalzahl muss mit einer führenden 0 beginnen, damit PHP sie als Oktalwert erkennt:
<?php
/* Korrekt: Oktalzahl mit führender 0 */
chmod('upload/bilder', 0755);
/* FALSCH: String statt Oktalzahl!
'0755' wird als Dezimal 755 interpretiert,
was völlig andere Rechte ergibt */
chmod('upload/bilder', '0755');
?>
Die Oktalzahl besteht aus vier Stellen. Die erste ist meist 0 (keine Sonderbits). Die drei weiteren Stellen stehen für Eigentümer, Gruppe und alle anderen. Jede Stelle ist die Summe aus: Lesen (4) + Schreiben (2) + Ausführen (1).
Gängige Rechtewerte
In der Praxis kommen fast immer dieselben Kombinationen zum Einsatz:
<?php
/* 0644: Standard für Dateien
Eigentümer: Lesen + Schreiben
Gruppe/Andere: nur Lesen */
chmod('config.ini', 0644);
/* 0755: Standard für Verzeichnisse
Eigentümer: Lesen + Schreiben + Ausführen
Gruppe/Andere: Lesen + Ausführen */
chmod('upload/', 0755);
/* 0600: Sensible Dateien
Nur der Eigentümer kann lesen und schreiben */
chmod('zugangsdaten.php', 0600);
?>
Verzeichnisse brauchen immer das Ausführen-Recht (1), damit ihr Inhalt aufgelistet werden kann. Deshalb ist 0755 für Ordner der Standard, während Dateien mit 0644 auskommen.
Praxisbeispiel mit Fehlerbehandlung
chmod() gibt true bei Erfolg und false bei einem Fehler zurück. Fehler treten zum Beispiel auf, wenn die Datei nicht existiert oder der Webserver nicht der Eigentümer ist:
<?php
$datei = 'upload/tmp';
if (chmod($datei, 0755)) {
echo 'Rechte für ' . $datei . ' auf 0755 gesetzt.';
} else {
echo 'Rechte konnten nicht geändert werden.';
}
?>
Auf Shared-Hosting-Servern kann chmod() eingeschränkt sein. Manche Hoster erlauben Rechteänderungen nur über FTP oder das Hosting-Panel.
Aktuelle Rechte auslesen mit fileperms()
Um die aktuellen Zugriffsrechte einer Datei zu prüfen, gibt es fileperms(). Der Rückgabewert ist eine Ganzzahl, die mit decoct() in die lesbare Oktalform umgewandelt wird:
<?php
$rechte = fileperms('upload/');
/* Die letzten 4 Stellen der Oktaldarstellung */
echo substr(decoct($rechte), -4); // z.B. 0755
?>
So lässt sich prüfen, ob eine Datei bereits die richtigen Rechte hat, bevor chmod() aufgerufen wird.
Sicherheitshinweis
Die Rechte 0777 (alle dürfen alles) sollten vermieden werden. Wenn jeder Benutzer auf dem Server eine Datei ändern oder ausführen kann, öffnet das Tür und Tor für Angriffe. Für Upload-Verzeichnisse reicht 0755, für hochgeladene Dateien 0644.