2009-10-09 7 views
8

Ich habe einen SocketServer akzeptieren eingehende Verbindungen. Aus Sicherheitsgründen sollte ich nur lokale Verbindungen erlauben (Verbindungen von dem Rechner, auf dem der Server läuft).So ermitteln Sie eine eingehende Verbindung vom lokalen Rechner

Wie kann ich feststellen, ob eine eingehende Verbindung von einer anderen Maschine stammt? Ist der folgende Code sicher?

Socket socket = someServerSocket.accept(); 
String remoteAddress = socket .getInetAddress().getHostAddress(); 
if (!fromThisMachine(remoteAddress)) { 
    // Not from this machine. 
} 

während fromThisMachine() Methode ist wie folgt:

public boolean fromThisMachine(String remoteAddress) { 
    try { 
     Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
     while (interfaces.hasMoreElements()) { 
      NetworkInterface networkInterface = interfaces.nextElement(); 
      Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); 
      while (addresses.hasMoreElements()) { 
       InetAddress inetAddress = addresses.nextElement(); 
       String hostName = inetAddress.getHostName(); 
       String hostAddr = inetAddress.getHostAddress(); 
       if (hostName.equals(remoteAddress) || hostAddr.equals(remoteAddress)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    log("Unauthorized request to server from: " + remoteAddress); 
    return false; 
} 

Danke, Mohsen

Antwort

7

Wenn Sie Verbindungen vom lokalen Host zu begrenzen, dann angeben, wenn Sie die Serversocket öffnen. Wenn Sie nur auf localhost hören, erhalten Sie nur Verbindungen von localhost.

int port = ..... 
    SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); 
    ServerSocket serverSocket = new ServerSocket(); 
    serverSocket.bind(socketAddress); 
    serverSocket.accept(); 
+0

Es funktioniert nicht. Siehe: Ich bin auf 192.168.0.1 und jemand anderes auf 192.168.0.2. Ich möchte seinen Zugriff auf meinen Server-Socket auf 192.168.0.1: Port verweigern, aber diese Lösung funktioniert nicht. Es hat nur dazu geführt, dass die Verbindung zu 127.0.0.1:port von meinem eigenen Rechner aus nicht funktioniert. – Mohsen

+1

Dies ist keine Antwort auf die Frage. Warum ist es falsch markiert? Die anderen Antworten sind auch falsch in diesem Fall sollte es offen und unbeantwortet für alle anderen Menschen, die das gleiche Problem haben. – Lothar

3

Danke skaffman. Der folgende Code funktionierte mit ein wenig Manipulation (Hartcodierung 127.0.0.1).

int port = ..... 
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); 
ServerSocket serverSocket = new ServerSocket(); 
serverSocket.bind(socketAddress); 
serverSocket.accept(); 

Wenn ich lokale Adresse von InetAddress.getLocalHost(), andere Netzwerkbenutzer auf dem gleichen Subnetz sind noch in der Lage zu meinem Server sehen zu lesen.

Mohsen.

+0

D'oh, ja, ich habe vergessen, dass 'InetAddess.getLocalHost() 'gibt Ihnen 127.0.0.1 nicht, es gibt die externe IP-Adresse des lokalen Hosts. Mein Fehler. – skaffman

+0

Ja, ich habe festgestellt, dass InetAddress.getLocalHost() nicht wirklich wie erwartet funktioniert. – spender

+1

Seien Sie gewarnt, dass die Annahme "Ich höre auf 127.0.0.1, also nur lokale Benutzer können sich mit mir verbinden" manchmal fehlschlägt - z. B. wenn Sie einen Proxy auf Ihrem Rechner ausführen, der im Namen von 127.0.0.1 zur Verbindung gezwungen werden kann ein entfernter Benutzer. – caf

11

InetAddress.getByName (null) gibt immer die Loopback-Adresse zurück. Siehe javadoc

int port = ..... 
    SocketAddress socketAddress = 
     new InetSocketAddress(InetAddress.getByName(null), port); 
    ServerSocket serverSocket = new ServerSocket(); 
    serverSocket.bind(socketAddress); 
    serverSocket.accept(); 
+0

Nice one. Ich wünschte, ich hätte das vor einer Weile gewusst. Ich wurde furchtbar verwirrt. – spender

+3

Dies ist eines der schlimmsten Beispiele für Feature-Creep. Die Bereitstellung von 'InetAddress.getLoopbackAddress()' würde so viel sauberer sein. Ich habe das einfach durch Zufall entdeckt. Die Adressfolge in meiner Anwendung wurde unter bestimmten Bedingungen auf Null gesetzt und statt NPE tuckerte meine Anwendung immer noch alleine. Dies hat eine wertvolle Lektion gelehrt, Java API sorgfältig und mit voller Aufmerksamkeit zu lesen. –

+0

@AlexanderPogrebnyak, dumme Frage ... was ist mit [InetAddress.isLoopbackAddress()] (http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--)? – Gili

Verwandte Themen