Start · Sprachen · PHP · Referenz · posix_eaccess

posix_eaccess

Funktion

Prüft anhand der effektiven Benutzer-ID (eUID/eGID), ob der aktuelle Prozess auf eine Datei zugreifen darf.

seit PHP 5.3.0 Kategorie: misc

Signatur

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

Beschreibung

posix_eaccess() testet, ob der laufende PHP-Prozess auf die angegebene Datei oder das Verzeichnis zugreifen kann. Im Unterschied zu posix_access() verwendet diese Funktion die effektive Benutzer- und Gruppen-ID (eUID/eGID) statt der realen (rUID/rGID). Das ist besonders dann relevant, wenn der Prozess über setuid/setgid-Mechanismen erweiterte Rechte erhalten hat.

Über den Parameter $flags lässt sich festlegen, welcher Zugriffstyp geprüft werden soll: Existenz (POSIX_F_OK), Leseberechtigung (POSIX_R_OK), Schreibberechtigung (POSIX_W_OK) oder Ausführberechtigung (POSIX_X_OK). Mehrere Flags können per bitweisem ODER (|) kombiniert werden.

Die Funktion ist ausschließlich auf POSIX-konformen Systemen (Linux, macOS, *BSD) verfügbar und steht unter Windows nicht zur Verfügung. Sie setzt die POSIX-Erweiterung voraus, die auf den meisten Unix-ähnlichen PHP-Installationen standardmäßig vorhanden ist.

Typische Anwendungsfälle sind Berechtigungsprüfungen vor Dateioperationen in privilegierten Skripten oder Daemon-Prozessen, bei denen die effektiven Rechte von den realen abweichen können.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei oder zum Verzeichnis, deren Zugriffsrechte geprüft werden sollen.
$flags int POSIX_F_OK Bitmaske aus einer oder mehreren POSIX-Konstanten: POSIX_F_OK (Datei existiert), POSIX_R_OK (lesbar), POSIX_W_OK (schreibbar), POSIX_X_OK (ausführbar). Mehrere Flags werden per | kombiniert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Zugriff gemäß den angegebenen Flags erlaubt ist, andernfalls false. Bei einem Fehler (z. B. ungültiger Pfad) wird ebenfalls false zurückgegeben.

Beispiele

Existenz und Lesbarkeit einer Datei prüfen

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

if (posix_eaccess($datei, POSIX_F_OK | POSIX_R_OK)) {
    echo "Die Datei existiert und ist lesbar.";
} else {
    echo "Kein Zugriff auf die Datei.";
}
?>
Die Datei existiert und ist lesbar.

Schreib- und Ausführbarkeit eines Verzeichnisses prüfen

<?php
$verzeichnis = '/tmp';

$schreibbar = posix_eaccess($verzeichnis, POSIX_W_OK);
$ausfuehrbar = posix_eaccess($verzeichnis, POSIX_X_OK);

if ($schreibbar && $ausfuehrbar) {
    echo "Das Verzeichnis ist schreibbar und begehbar.";
} else {
    echo sprintf(
        "Schreibbar: %s | Begehbar: %s",
        $schreibbar ? 'ja' : 'nein',
        $ausfuehrbar ? 'ja' : 'nein'
    );
}
?>
Das Verzeichnis ist schreibbar und begehbar.

Unterschied zwischen effektiver und realer ID demonstrieren

<?php
// posix_eaccess() nutzt die *effektive* UID/GID (z. B. nach setuid-Mechanismen),
// posix_access() nutzt die *reale* UID/GID.

$datei = '/var/log/syslog';

echo 'posix_eaccess (effektiv): ';
echo posix_eaccess($datei, POSIX_R_OK) ? 'lesbar' : 'nicht lesbar';
echo PHP_EOL;

echo 'posix_access  (real):     ';
echo posix_access($datei, POSIX_R_OK) ? 'lesbar' : 'nicht lesbar';
echo PHP_EOL;
?>

// Wichtig · Fallstricke

Sicherheitshinweis (TOCTOU): Wie alle Berechtigungsprüfungen vor einer eigentlichen Dateioperation unterliegt posix_eaccess() dem Time-of-Check / Time-of-Use-Problem. Zwischen der Prüfung und dem tatsächlichen Zugriff können sich Dateisystemrechte ändern. Nutze die Funktion daher nur zur Vorabinformation, aber nicht als alleinige Sicherheitsbarriere.

Die Funktion ist nicht unter Windows verfügbar. Skripte, die Portabilität erfordern, sollten die Verfügbarkeit der POSIX-Erweiterung mit function_exists('posix_eaccess') prüfen.

Auf einigen älteren Systemen fehlt der zugrundeliegende eaccess()-Systemaufruf; in diesem Fall greift PHP intern auf access() zurück, was das Verhalten von posix_access() entspricht.