Beim Schreiben von Socket-basierten Serverprogrammen mit PHP ist Socket_accept () eine Schlüsselfunktion zum Akzeptieren von Client-Verbindungen. Obwohl diese Funktion sehr praktisch ist, hat sie keine Zugriffskontrollfunktionen. Wenn Sie möchten, dass Ihr Dienst nur bestimmte IP -Adressen verbindet, müssen Sie den IP -Whitelist -Filtermechanismus selbst implementieren.
In diesem Artikel wird detailliert vorgestellt, wie die IP -Whitelisting -Funktion zu Diensten mithilfe von Socket_accept () hinzugefügt wird, um die Sicherheits- und Steuerungsfunktionen für die Service zu verbessern.
Schauen wir uns zunächst eine typische Basic -Socket -Service -Struktur mit Socket_accept () an:
$host = '0.0.0.0';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Der Server wird gestartet,Hören Sie sich Port an $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
// Wird hier hinzufügen IP Whitelist Filterlogik
}
Standardmäßig akzeptiert der obige Code Verbindungsanfragen von allen Clients unbegrenzt. Um der IP -Whitelist -Steuerung beizutreten, müssen wir Socket_getPeername () verwenden, um die Client -IP nach Socket_accept () zu erhalten, und dann festzustellen, ob sich die IP im Whitelist befindet.
Das Folgende ist der geänderte Code, der einen einfachen Whitelisting -Mechanismus hinzufügt:
$host = '0.0.0.0';
$port = 12345;
// IP Whitelist
$whitelist = [
'192.168.1.100',
'203.0.113.45',
'198.51.100.23'
];
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Der Server wird gestartet,Hören Sie sich Port an $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
continue;
}
socket_getpeername($clientSocket, $clientIp);
if (!in_array($clientIp, $whitelist)) {
echo "Ablehnen von $clientIp Verbindung。\n";
socket_close($clientSocket);
continue;
}
echo "Akzeptiert von $clientIp Verbindung。\n";
// Die Client -Anforderungslogik wird hier verarbeitet
$welcomeMsg = "Willkommen zu Besuch m66.net Dienstleistungen。\n";
socket_write($clientSocket, $welcomeMsg, strlen($welcomeMsg));
socket_close($clientSocket);
}
Socket_getPeername () : Diese Funktion wird verwendet, um die IP -Adresse des angeschlossenen Clients zu erhalten.
Whitelist Array : Sie können die IP -Adresse, die Sie auf das $ Whitelist -Array zugreifen können, einfügen.
Verbindungsregelung : Für IPs, die nicht auf der Whitelist sind, verwenden wir direkt Socket_Close (), um die Verbindung zu trennen.
Hartcode-Whitelisten im Code wird nicht empfohlen und kann während der tatsächlichen Bereitstellung dynamisch aus der Datenbank- oder Konfigurationsdatei geladen werden.
Sie können in Betracht ziehen, Protokollierungsfunktionen hinzuzufügen, um illegale Verbindungsversuche zu verfolgen.
Durch Hinzufügen von IP -Whitelist -Überprüfungslogik nach Socket_accept () kann der nicht autorisierte Zugriff effektiv eingeschränkt werden und die Sicherheit von PHP -Socket -Diensten verbessert werden. Das obige Beispiel zeigt eine grundlegendste Implementierungsmethode, die Entwickler entsprechend den tatsächlichen Anforderungen erweitern können, z. B. das Hinzufügen von CIDR -Bereich, die Unterstützung von IPv6 -Adressen usw.
Wenn Sie ein PHP -Socket -Programm erstellen, das Dienstleistungen für die Außenwelt erbringt, sollten Sie unbedingt eine "erste Verteidigungslinie" behalten und nicht vertrauenswürdige Kunden problemlos auf Ihr System zugreifen. Ich hoffe, dieser Artikel ist für Sie hilfreich!