2008-09-19 14 views
8

Ich habe eine Java-App (die nicht in einem Anwendungscontainer ausgeführt wird), die auf einem ServerSocket für Verbindungen abhört. Ich möchte nur Verbindungen akzeptieren, die von localhost kommen. Momentan, nachdem eine Verbindung akzeptiert wurde, überprüft sie die Peer-IP und weist sie zurück, wenn sie nicht die Loopback-Adresse ist, aber ich weiß, dass Peer-IP-Adressen gefälscht werden können. Also, wenn möglich, würde ich lieber an einen Socket binden, der nur auf der Loopback-Schnittstelle lauscht; Ist das möglich?Wie kann ich einen Socket akzeptieren Verbindungen nur vom lokalen Host (in Java)?

Ich habe ein paar verschiedene Dinge ausprobiert (wie zum Beispiel "127.0.0.1" als lokale Adresse beim Aufruf bind()) ohne Glück. Danke im Voraus.


Vielen Dank für Ihre Hilfe. Es ist mir peinlich zuzugeben, dass dies alles mein Fehler war. Unsere Anwendung hört zwei verschiedene Ports ab, und ich habe einen an die Loopback-Schnittstelle gebunden, aber gegen den anderen getestet. Wenn ich tatsächlich versuche, an den richtigen Port telnet, funktioniert alles einwandfrei (d. H. Bindung an "127.0.0.1" tut genau das, was es soll).

Wie zum Spoofing der Loopback-Adresse, haben Sie recht. Ich hätte es nicht wie die Hauptsorge klingen lassen sollen. Tatsächlich besteht das gewünschte Verhalten darin, nur lokale Verbindungen einzugehen, und eine Bindung an nur die lokale Schnittstelle ist eine direktere Möglichkeit, dies zu erreichen, als alle Verbindungen zu akzeptieren und dann nicht-lokale zu schließen.

+0

Wo haben Sie die Information erhalten, dass 127.0.0.1 gefälscht werden kann? Ich bin skeptisch. –

Antwort

7

Peer-IP-Adressen können auf diese Weise nicht manipuliert werden. Sie haben nichts zu befürchten, wenn Sie die Technik der Überprüfung des Peers verwenden und entscheiden, die Verbindung während der Herstellung abzubrechen.

Allerdings: Bindung an 127.0.0.1 sollte funktionieren und das Betriebssystem veranlassen, dem verbindenden Host mitzuteilen, dass nichts zuhören kann, wenn sie eine der anderen IP-Adressen des Systems verbinden. Kannst du diese Frage mit einem kompilierbaren Beispiel ändern? Vielleicht haben Sie einen einfachen Fehler gemacht.

1

Wenn Sie Ihren ServerSocket binden, sollte localhost angeben, dass der TCP/IP-Stack die Verbindung ablehnt. Selbst wenn dies auf Ihrem System nicht funktioniert, kann localhost (okay, vielleicht, wenn jemand Ihren TCP/IP-Stack und den Standard-Gateway-Router gehackt hat) gefälscht werden, da diese Adresse nicht über die physikalische Schnittstelle geroutet wird.

Ich bin neugierig, warum Ihre Bindung nicht erfolgreich ist, was ist Ihr Betriebssystem, Java-Version, etc?

3

Sie könnten, wie Sie bereits zu tun scheinen, accept() die Verbindung sowieso dann verwenden getInetAddress(), um sicherzustellen, dass die Adresse eine autorisierte Adresse ist. Wenn nicht, schließen Sie einfach() die Steckdose sofort. 127.0.0.1 ist nicht eine Adresse, die gefälscht werden kann.

Alternativ können Sie Ihren eigenen Sicherheitsmanager installieren, dessen checkAccept() - Methode mit der Adresse und dem Port der Gegenstelle aufgerufen wird. Das ist etwas schwieriger - ich habe es nie versucht, da die erste Lösung für mich immer ausreichend war.

+1

Das Original-Poster hat schon gesagt, dass er das macht, aber nicht will, weil die entfernte Seite "gefälscht" werden kann oder so. – Jerub

+1

Jerub: Das OP versteht das Spoofing nicht. Pax: Jeder alte Sicherheitsmanager wird es tun, Sie müssen lediglich eine Richtlinie festlegen, die dem Code die richtigen Berechtigungen (permission java.net.SocketPermission "127.0.0.1" "listen, accept" oder etwas Ähnliches) gibt - Sie müssen die SecurityException abfangen von akzeptieren). –

3

Wenn die Peer-Adresse gefälscht ist, können Sie nichts weiter tun.

Allerdings ist es nicht einfach, 127.0.0.1 zu fälschen. Sie müssten einen TCP/IP-Stack haben, der dumm genug ist, ein solches Paket zu akzeptieren. Es gäbe keine Möglichkeit für den Spoofer, Pakete zurück zu empfangen. Auf einem guten TCP/IP-Stack sollte es nicht in der Lage sein, die Sequenznummern zu erraten, so dass es nicht mit der erwarteten Konversation mithalten kann.

2
if (socket.getInetAddress().isLoopbackAddress()){ 
    //Your code goes here 
} 
+0

Obwohl sich der Code selbst ausdrückt, werden Code-only-Antworten nicht empfohlen. Erwägen Sie, Dokumentationsreferenzen hinzuzufügen, was es tut und so weiter. – edmz