Suite à un article de Jim Barcelona sur phpwizard.net, Jason Perkins propose l'implémentation d'un sytème de scan de port TCP. Pour information, Jim Barcelona c'est inspiré du script de Armel Fauveau (vous ne revez pas !) publié sur phpbuilder.

Partant donc de cette ébauche de scanner de port, Jason a implémenté une classe permettant de scanner les ports d'un serveur avec le protocol TCP mais aussi UDP.

Le principe est simple :

- connexion au serveur avec la fonction fsockopen
- détermination du service qui tourne sur ce port avec la fonction getservbyport

Lors de la tentative de connexion au serveur, la fonction fsockopen prend un paramètre de 'time out'. Celui-ci permettra de ne pas attendre indefiniment la reponse du serveur et d'en deduire que le port est fermé ou que le serveur fonctionne pas.

Le protocol UDP rend plus compliqué les choses. Un packet UDP est envoyé lors de la tentative de connexion au serveur sur un port déterminé.

Le serveur distant receptionne le packet UDP, regarde l'entête pour déterminé le port de destination. Si aucune application n'écoute sur ce port, alors un message d'erreur est envoyé de la forme suivante : 'ICMP Destination Unreachable: Port Unreachable'.

Le protocol UDP n'offrant aucune garantie de réception du message de connexion, le 'time out' est ici très important.

De plus un paquet perdu ne renverra aucune information en retour. Des statistiques, sur le nombre de paquets perdus, le nombre total de paquets envoyés et le temps moyen pour lire les paquets qui ont bien étés renvoyés par le serveur, sont des informations fort utiles que propose la classe udpPortScan.

Je vous conseille vivement de lire cet article qui en dit long sur les performances réseau de PHP.

Liens vers l'article
Securing Servers With PHP (Article sur PHPWizard.net)
Site où télécharger les classes tcpPortScan et udpPortScan