Signatur
Beschreibung
posix_seteuid() ändert die effektive Benutzer-ID (EUID) des laufenden PHP-Prozesses. Dies ist nützlich, wenn ein Prozess mit erhöhten Rechten (z. B. als root) gestartet wurde und temporär auf die Privilegien eines anderen Benutzers wechseln soll, ohne die reale Benutzer-ID dauerhaft aufzugeben.
Im Unterschied zu posix_setuid(), das sowohl die reale als auch die effektive Benutzer-ID ändert, beeinflusst posix_seteuid() nur die effektive UID. Dadurch kann ein Prozess, der ursprünglich als root läuft (oder eine passende gespeicherte Set-UID besitzt), jederzeit wieder zur ursprünglichen UID zurückwechseln.
Typische Einsatzgebiete sind Daemon-Prozesse oder CLI-Skripte, die kurzfristig bestimmte Operationen mit den Rechten eines anderen Benutzers ausführen müssen und danach wieder zur ursprünglichen Privilegienstufe zurückkehren wollen. Die Funktion ist nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) verfügbar.
Voraussetzung für den Aufruf ist entweder, dass der Prozess als root läuft, oder dass die gewünschte user_id der realen UID des Prozesses entspricht. Andernfalls schlägt der Aufruf fehl und gibt false zurück.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $user_id Pflicht | int | Die numerische Benutzer-ID (UID), auf die die effektive Benutzer-ID des aktuellen Prozesses gesetzt werden soll. Der Wert muss eine gültige UID auf dem System sein. |
Rückgabewert
true zurück, wenn die effektive Benutzer-ID erfolgreich gesetzt wurde. Gibt false zurück, wenn der Aufruf fehlschlug (z. B. unzureichende Berechtigungen oder ungültige UID). Im Fehlerfall kann mit posix_get_last_error() und posix_strerror() der Grund abgefragt werden.Beispiele
Effektive Benutzer-ID temporär wechseln und zurücksetzen
<?php
// Nur als root oder mit passenden Privilegien sinnvoll
$originalEuid = posix_geteuid();
echo "Aktuelle EUID: " . $originalEuid . PHP_EOL;
$targetUid = 1000; // z. B. normaler Benutzer
if (posix_seteuid($targetUid)) {
echo "EUID erfolgreich auf " . posix_geteuid() . " gesetzt." . PHP_EOL;
// Operationen mit den Rechten des Zielbenutzers ...
// Zurück zur ursprünglichen effektiven UID
if (posix_seteuid($originalEuid)) {
echo "EUID wiederhergestellt: " . posix_geteuid() . PHP_EOL;
}
} else {
$errNo = posix_get_last_error();
$errMsg = posix_strerror($errNo);
echo "Fehler beim Setzen der EUID: [{$errNo}] {$errMsg}" . PHP_EOL;
}
Verfügbarkeit der POSIX-Erweiterung prüfen
<?php
if (!function_exists('posix_seteuid')) {
echo "posix_seteuid ist nicht verfügbar (Windows oder fehlende Erweiterung)." . PHP_EOL;
exit(1);
}
$uid = posix_getpwnam('www-data');
if ($uid === false) {
echo "Benutzer 'www-data' nicht gefunden." . PHP_EOL;
exit(1);
}
if (posix_seteuid($uid['uid'])) {
echo "Effektive UID auf www-data (" . $uid['uid'] . ") gesetzt." . PHP_EOL;
} else {
echo "Fehler: " . posix_strerror(posix_get_last_error()) . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Das Wechseln der effektiven Benutzer-ID ist ein sicherheitsrelevanter Vorgang. Stellen Sie sicher, dass die Ziel-UID korrekt validiert wurde und kein Angreifer Einfluss auf den übergebenen Wert nehmen kann. Ein unbeabsichtigter Wechsel zu root (UID 0) kann schwerwiegende Sicherheitslücken öffnen.
Plattform: posix_seteuid() ist nur auf POSIX-kompatiblen Betriebssystemen verfügbar. Unter Windows existiert diese Funktion nicht. Die PHP-POSIX-Erweiterung muss aktiviert sein (ext-posix).
Unterschied zu posix_setuid(): posix_setuid() setzt reale, effektive und gespeicherte UID dauerhaft, ein Zurückwechseln zu root ist danach nicht mehr möglich. posix_seteuid() erlaubt hingegen das reversible Wechseln der effektiven UID, sofern die reale oder gespeicherte UID die Rückkehr erlaubt.