2009-08-13 5 views
2

Quelle serait la meilleure méthode pour restreindre l'accès à mon serveur XMLRPC par adresse IP? Je vois la classe CGIScript dans web/twcgi.py a une méthode de rendu qui accède à la requête ... mais je ne suis pas sûr de la façon d'accéder à cette requête sur mon serveur. J'ai vu un exemple où quelqu'un a corrigé twcgi.py pour définir des variables d'environnement et ensuite dans le serveur accéder aux variables d'environnement ... mais je pense qu'il doit y avoir une meilleure solution.Python Twisted: restriction de l'accès par adresse IP

Merci.

Répondre

5

Lorsqu'une connexion est établie, le buildProtocol d'une fabrique est appelé pour créer une nouvelle instance de protocole pour gérer cette connexion. buildProtocol est passé l'adresse de l'homologue qui a établi la connexion et buildProtocol peut renvoyer None pour que la connexion soit immédiatement fermée.

Ainsi, par exemple, vous pouvez écrire une usine comme ceci:

from twisted.internet.protocol import ServerFactory 

class LocalOnlyFactory(ServerFactory): 
    def buildProtocol(self, addr): 
     if addr.host == "127.0.0.1": 
      return ServerFactory.buildProtocol(self, addr) 
     return None 

Et seules les connexions locales seront traitées (mais toutes les connexions, sera accepté initialement puisque vous devez les accepter d'apprendre ce que les pairs L'adresse est).

Vous pouvez l'appliquer à l'usine que vous utilisez pour traiter les ressources XML-RPC. Il suffit de sous-classer cette fabrique et d'ajouter une logique comme celle-ci (ou vous pouvez faire un wrapper au lieu d'une sous-classe). Toutefois, iptables ou un autre pare-feu de plate-forme est également une bonne idée pour certains cas. Avec cette approche, votre processus n'a même jamais besoin de voir la tentative de connexion.

+0

+1 en effet, c'est le meilleur endroit pour appliquer le chèque. Merci. – nosklo

0

Je voudrais utiliser un pare-feu sur Windows, ou iptables sur Linux.

+1

iptables est une option pour verrouiller les adresses IP, mais je veux faire certaines choses personnalisées comme l'autorisation de certaines méthodes pour certaines adresses IP. – sberry

2

D'accord, une autre réponse est d'obtenir l'adresse IP de transport, à l'intérieur de tout protocole:

d =self.transport.getHost() ; print d.type, d.host, d.port

Ensuite, utilisez la valeur pour filtrer de quelque façon que vous voulez.