Signatur
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
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";
}
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";
}
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";
}
// 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).