2009-08-13 10 views
2

Was wäre die beste Methode, um den Zugriff auf meinen XMLRPC-Server per IP-Adresse einzuschränken? Ich sehe, dass die Klasse CGIScript in web/twcgi.py eine Rendermethode hat, die auf die Anfrage zugreift ... aber ich bin nicht sicher, wie ich auf diese Anfrage auf meinem Server zugreifen kann. Ich habe ein Beispiel gesehen, wo jemand twcgi.py gepatcht hat, um Umgebungsvariablen zu setzen und dann auf dem Server auf die Umgebungsvariablen zuzugreifen ... aber ich denke, es muss eine bessere Lösung geben.Python Twisted: Zugriffsbeschränkung per IP-Adresse

Danke.

Antwort

5

Wenn eine Verbindung hergestellt wird, wird das BuildProtocol einer Factory aufgerufen, um eine neue Protokollinstanz für diese Verbindung zu erstellen. buildProtocol wird die Adresse des Peers übergeben, der die Verbindung hergestellt hat, und buildProtocol kann None zurückgeben, damit die Verbindung sofort geschlossen wird.

So zum Beispiel, können Sie eine Fabrik wie folgt schreiben können:

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 

Und nur lokale Verbindungen gehandhabt wird (aber alle Verbindungen zunächst noch akzeptiert werden, da man sie der Peer lernen akzeptieren müssen, was die Adresse ist).

Sie können dies auf die Factory anwenden, die Sie zum Bereitstellen von XML-RPC-Ressourcen verwenden. Unterordnen Sie diese Factory einfach und fügen Sie eine Logik wie diese hinzu (oder Sie können einen Wrapper anstelle einer Unterklasse erstellen).

iptables oder eine andere Plattform Firewall ist auch eine gute Idee für einige Fälle. Bei diesem Ansatz muss Ihr Prozess den Verbindungsversuch nicht einmal sehen.

+0

+1 in der Tat, das ist der beste Ort, um den Scheck zu beantragen. Vielen Dank. – nosklo

0

Ich würde eine Firewall auf Windows oder iptables auf Linux verwenden.

+1

iptables sind eine Option zum Sperren von IPs, aber ich möchte einige benutzerdefinierte Dinge tun, wie bestimmte Methoden für bestimmte IPs zulassen. – sberry

2

Okay, eine andere Antwort ist die IP-Adresse aus dem Verkehr zu bekommen, innerhalb jedes Protokoll:

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

dann den Wert verwenden, um es zu filtern, die in irgendeiner Weise Sie wollen.