Lors de l'écriture de programmes de serveurs basés sur des socket utilisant PHP, socket_accept () est une fonction clé pour accepter les connexions client. Bien que cette fonction soit très pratique, elle n'a pas de fonctions de contrôle d'accès. Si vous souhaitez que votre service n'autorise que les adresses IP spécifiques pour se connecter, vous devez vous implémenter vous-même le mécanisme de filtrage de la liste blanche IP.
Cet article présentera en détail comment ajouter une fonction de liste blanche IP aux services à l'aide de socket_accept () pour améliorer les capacités de sécurité et de contrôle des services.
Tout d'abord, regardons une structure de service de base de base typique à l'aide de socket_accept () :
$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 "Le serveur est démarré,Écouter le port $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
// Ajoutera ici IP Logique de filtrage de liste blanche
}
Par défaut, le code ci-dessus acceptera les demandes de connexion de tous les clients à peu près. Afin de rejoindre le contrôle de la liste blanche IP, nous devons utiliser socket_getpeername () pour obtenir le client IP après socket_accept () , puis déterminer si l'IP est dans la liste blanche.
Ce qui suit est le code modifié, ajoutant un simple mécanisme de liste blanche:
$host = '0.0.0.0';
$port = 12345;
// IP Liste blanche
$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 "Le serveur est démarré,Écouter le port $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
continue;
}
socket_getpeername($clientSocket, $clientIp);
if (!in_array($clientIp, $whitelist)) {
echo "Rejeter de $clientIp Connexion。\n";
socket_close($clientSocket);
continue;
}
echo "Accepté de $clientIp Connexion。\n";
// La logique de la demande du client est traitée ici
$welcomeMsg = "Bienvenue à visiter m66.net Services。\n";
socket_write($clientSocket, $welcomeMsg, strlen($welcomeMsg));
socket_close($clientSocket);
}
socket_getpeername () : Cette fonction est utilisée pour obtenir l'adresse IP du client connecté.
Array de liste blanche : vous pouvez mettre l'adresse IP que vous autorisez à accéder dans le tableau de liste blanche $ .
Contrôle de connexion : pour les IP qui ne sont pas sur la liste blanche, nous utilisons directement socket_close () pour déconnecter.
Il n'est pas recommandé de coder les listes blanches dans le code et peut être chargée dynamiquement à partir de la base de données ou du fichier de configuration pendant le déploiement réel.
Vous pouvez envisager d'ajouter une fonction de journalisation pour suivre les tentatives de connexion illégales.
En ajoutant la logique de vérification de la liste blanche IP après socket_accept () , l'accès non autorisé peut être efficacement restreint et la sécurité des services de socket PHP peut être améliorée. L'exemple ci-dessus montre une méthode de mise en œuvre la plus élémentaire, que les développeurs peuvent se développer en fonction des besoins réels, tels que l'ajout de la plage CIDR, la prise en charge d'adresses IPv6, etc.
Lors de la création d'un programme de socket PHP qui fournit des services au monde extérieur, assurez-vous de garder une «première ligne de défense» et de ne pas permettre aux clients non fiables d'accéder facilement à votre système. J'espère que cet article vous est utile!