Start · Sprachen · PHP · Referenz · posix_access

posix_access

Funktion

Prüft, ob der aktuelle Prozess bestimmte Zugriffsrechte auf eine Datei oder ein Verzeichnis besitzt.

seit PHP 5.1.0 Kategorie: misc

Signatur

posix_access(string $filename, int $flags = POSIX_F_OK): bool

Beschreibung

posix_access() nutzt den POSIX-Systemaufruf access(2), um zu ermitteln, ob der aktuelle Prozess (basierend auf der real UID/GID, nicht der effektiven) die angegebene Zugriffsart auf eine Datei oder ein Verzeichnis besitzt. Die Prüfart wird über Flags gesteuert, die mit dem bitweisen ODER-Operator kombiniert werden können.

Verfügbare Flags sind: POSIX_F_OK (Datei existiert), POSIX_R_OK (Lesezugriff), POSIX_W_OK (Schreibzugriff) und POSIX_X_OK (Ausführzugriff). Mehrere Prüfungen können kombiniert werden, z. B. POSIX_R_OK | POSIX_W_OK, um gleichzeitig Lese- und Schreibrechte zu prüfen.

Die Funktion ist besonders nützlich in CLI-Skripten und Servierdaemon-Prozessen, die unter bestimmten Systembenutzern laufen und vorab prüfen möchten, ob Dateioperationen überhaupt erlaubt sind, bevor aufwändige Operationen gestartet werden. Wichtig: Die Funktion steht nur auf POSIX-konformen Systemen (Linux, macOS, Unix) zur Verfügung, nicht unter Windows.

Da die Prüfung auf der realen Benutzeridentität basiert, kann das Ergebnis bei setuid/setgid-Prozessen von dem abweichen, was bei einem tatsächlichen Dateizugriff (der die effektive UID nutzt) passieren würde.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Der Pfad zur Datei oder zum Verzeichnis, dessen Zugriffsrechte geprüft werden sollen.
$flags int POSIX_F_OK Eine Kombination der Konstanten POSIX_F_OK, POSIX_R_OK, POSIX_W_OK und POSIX_X_OK, die mit dem bitweisen ODER-Operator verknüpft werden können. Der Standardwert POSIX_F_OK prüft lediglich, ob die Datei existiert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn alle angegebenen Zugriffsrechte vorhanden sind, andernfalls false. Im Fehlerfall (z. B. ungültiger Pfad) wird ebenfalls false zurückgegeben; der genaue Fehler kann mit posix_get_last_error() und posix_strerror() ermittelt werden.

Beispiele

Existenz und Lesbarkeit einer Datei prüfen

<?php
$datei = '/etc/passwd';

if (posix_access($datei, POSIX_F_OK | POSIX_R_OK)) {
    echo "Die Datei existiert und ist lesbar.\n";
} else {
    $fehlerNr  = posix_get_last_error();
    $fehlerMsg = posix_strerror($fehlerNr);
    echo "Zugriff verweigert oder Datei nicht gefunden: {$fehlerMsg}\n";
}
Die Datei existiert und ist lesbar.

Schreib- und Ausführrechte kombiniert prüfen

<?php
$verzeichnis = '/tmp/mein_verzeichnis';

// Prüfen, ob das Verzeichnis beschreibbar und ausführbar (cd-fähig) ist
if (posix_access($verzeichnis, POSIX_W_OK | POSIX_X_OK)) {
    echo "Das Verzeichnis ist beschreibbar und durchsuchbar.\n";
} else {
    echo "Fehlende Schreib- oder Ausführrechte auf: {$verzeichnis}\n";
    echo 'POSIX-Fehler: ' . posix_strerror(posix_get_last_error()) . "\n";
}
Das Verzeichnis ist beschreibbar und durchsuchbar.

Nur Existenz einer Datei prüfen (Standard-Flag)

<?php
$konfigDatei = '/etc/myapp/config.ini';

// POSIX_F_OK ist der Standard und prüft nur, ob die Datei existiert
if (posix_access($konfigDatei)) {
    echo "Konfigurationsdatei gefunden.\n";
} else {
    echo "Konfigurationsdatei nicht vorhanden.\n";
}
Konfigurationsdatei nicht vorhanden.

// Wichtig · Fallstricke

Sicherheitshinweis (TOCTOU): Zwischen dem Prüfen mit posix_access() und dem tatsächlichen Zugriff auf die Datei kann sich der Dateizustand ändern (Time-of-check to time-of-use, TOCTOU). Verlasse dich daher nicht ausschließlich auf diese Funktion für sicherheitskritische Entscheidungen, sondern behandle Fehler beim eigentlichen Dateizugriff ebenfalls robust.

Real-UID vs. effektive UID: Die Funktion prüft auf Basis der realen Benutzer- und Gruppen-ID, nicht der effektiven. Bei setuid-Programmen können die Ergebnisse daher von dem abweichen, was beim tatsächlichen Dateizugriff passiert, der die effektive UID verwendet.

Plattformverfügbarkeit: posix_access() ist nur auf POSIX-konformen Systemen (Linux, macOS, BSD) verfügbar. Unter Windows steht die Funktion nicht zur Verfügung. Die POSIX-Erweiterung muss beim PHP-Build eingebunden sein (Standard bei Linux-Paketen).