Start · Sprachen · PHP · Referenz · tcpwrap_check

tcpwrap_check

Funktion

Prüft anhand der TCP-Wrapper-Bibliothek (libwrap), ob ein Client Zugriff auf einen Dienst erhalten darf.

Kategorie: http

Signatur

tcpwrap_check(string $daemon, string $address, string $user = null, bool $nodns = false): bool

Beschreibung

tcpwrap_check() ruft die libwrap-Bibliothek (TCP-Wrapper) auf, um zu prüfen, ob ein bestimmter Client-Host Zugriff auf den angegebenen Dienst erhalten soll. Die Entscheidung basiert auf den Regeln in /etc/hosts.allow und /etc/hosts.deny.

Die Funktion ist nützlich, wenn man in einer PHP-Anwendung (z. B. einem selbst geschriebenen Daemon oder Socket-Server) dieselbe Zugriffskontrolle wie klassische Unix-Dienste (inetd, sshd, etc.) nutzen möchte, ohne die Regeln selbst verwalten zu müssen.

Der Parameter daemon entspricht dem Dienst-Namen, unter dem in /etc/hosts.allow und /etc/hosts.deny nach Regeln gesucht wird. Der Parameter address ist die IP-Adresse des anfragenden Clients. Optional kann ein Benutzername sowie ein Flag zur DNS-Auflösung angegeben werden.

Hinweis: Diese Funktion steht nur zur Verfügung, wenn PHP mit dem tcpwrap-Modul kompiliert wurde und libwrap auf dem System installiert ist.

Parameter

Name Typ Default Beschreibung
$daemon Pflicht string Der Name des Dienstes, der in den TCP-Wrapper-Konfigurationsdateien (/etc/hosts.allow, /etc/hosts.deny) nachgeschlagen wird, z. B. "vsftpd" oder ein eigener Dienst-Name.
$address Pflicht string Die IP-Adresse des anfragenden Clients als Zeichenkette, z. B. "192.168.1.100".
$user string Optionaler Benutzername des Clients, der bei der Zugriffskontrolle berücksichtigt werden kann. Wenn nicht angegeben oder null, wird kein Benutzername übergeben.
$nodns bool false Wenn true, wird keine DNS-Auflösung durchgeführt. Dies verhindert potenzielle Verzögerungen oder Sicherheitsprobleme durch DNS-Lookups.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Zugriff des Clients gemäß den TCP-Wrapper-Regeln erlaubt ist, andernfalls false.

Beispiele

Einfache Zugriffsprüfung für einen eigenen Dienst

<?php
// Client-IP aus dem Socket auslesen (hier simuliert)
$clientIp = '192.168.1.50';
$daemon   = 'myphpd'; // Dienst-Name in /etc/hosts.allow oder /etc/hosts.deny

if (tcpwrap_check($daemon, $clientIp)) {
    echo "Zugriff erlaubt für $clientIp";
} else {
    echo "Zugriff verweigert für $clientIp";
    // Verbindung schließen oder Fehlermeldung senden
}
Zugriff erlaubt für 192.168.1.50

Prüfung ohne DNS-Auflösung und mit Benutzername

<?php
$clientIp   = '10.0.0.25';
$daemon     = 'myphpd';
$clientUser = 'johndoe';

// nodns = true verhindert Reverse-DNS-Lookups
if (tcpwrap_check($daemon, $clientIp, $clientUser, true)) {
    echo "Benutzer '$clientUser' von $clientIp hat Zugriff.";
} else {
    echo "Zugriff für Benutzer '$clientUser' von $clientIp verweigert.";
}
Benutzer 'johndoe' von 10.0.0.25 hat Zugriff.

// Wichtig · Fallstricke

Verfügbarkeit: tcpwrap_check() ist nur verfügbar, wenn die PHP-Extension tcpwrap installiert und aktiviert ist sowie libwrap auf dem System vorhanden ist. Die Extension ist nicht standardmäßig in PHP enthalten und gilt als wenig verbreitet.

Sicherheit: Verlasse dich nicht ausschließlich auf TCP-Wrapper-Regeln als einzige Sicherheitsschicht. Sie sind ein ergänzendes Mittel zur Zugriffskontrolle, aber kein Ersatz für eine vollständige Applikations-Authentifizierung und -Autorisierung.

DNS-Sicherheit: Standardmäßig wird ein Reverse-DNS-Lookup durchgeführt. Dies kann durch DNS-Spoofing missbraucht werden. Setze nodns auf true, um dieses Risiko zu vermeiden, wenn Hostname-basierte Regeln nicht benötigt werden.

Deprecation: Die tcpwrap-Extension wurde für neuere PHP-Versionen nicht aktiv gepflegt. Ihre Verfügbarkeit in modernen PHP-Umgebungen (PHP 7+) ist nicht garantiert.