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