Comment puis-je avoir un socket accepter uniquement les connexions à partir de l'hôte local (en Java)?
J'ai une application java (pas en cours d'exécution dans une application conteneur) qui écoute sur un ServerSocket pour les connexions. J'aimerais que ce n'accepter que les connexions qui viennent de localhost. Actuellement, après une connexion est acceptée, il vérifie les pairs IP et la rejette si elle n'est pas l'adresse de bouclage, mais je sais que les adresses IP peuvent être falsifiés. Donc, si possible, je préfère le lier à un socket qui n'écoute que sur l'interface de bouclage; est-ce possible?
J'ai essayé plusieurs choses différentes (telles que la spécification de "127.0.0.1", comme l'adresse locale lors de l'appel de bind()) avec pas de chance. Merci à l'avance.
Merci à vous tous pour votre aide. Je suis gêné d'admettre que tout cela était de ma faute. Notre application est à l'écoute sur deux ports différents, et je les liait l'un à l'interface de bouclage, mais l'essai contre l'autre. Quand j'ai effectivement essayer de telnet sur le port correct, tout fonctionne très bien (c'est à dire, les contraignant à "127.0.0.1" fait exactement ce qu'il est censé le faire).
Comme pour l'usurpation de l'adresse de bouclage, les gars, vous êtes de droite. Je ne devrais pas avoir fait ce qu'il sonne comme la principale préoccupation. Vraiment, le comportement désiré est de prendre seulement les connexions locales, et de la liaison à seulement l'interface locale est un moyen plus direct de la réalisation que d'accepter toutes les connexions et la fermeture de la non-locales.
OriginalL'auteur | 2008-09-19
Vous devez vous connecter pour publier un commentaire.
Par les pairs adresses IP ne peut pas être usurpée de cette manière, avez-vous rien à craindre de l'aide de la technique de l'inspection par les pairs et de décider de l'abandon de la connexion lors de l'établissement.
Cependant: la liaison à l'adresse 127.0.0.1 devrait fonctionner, et entraîner le système d'exploitation de dire à l'hôte de connexion qu'il n'y a rien à écouter si ils se connectent sur l'un des systèmes les autres adresses ip. Pouvez-vous modifier cette question avec un compilable exemple? Peut-être avez vous fait une simple erreur.
OriginalL'auteur Jerub
Si l'adresse de pair est usurpée, alors il n'y a rien de plus que vous pouvez faire.
Cependant, d'usurper l'adresse 127.0.0.1 n'est pas facile. Vous devez disposer d'une pile TCP/IP assez stupide pour accepter un tel paquet. Il n'y aurait pas moyen de l'usurpateur de la réception de paquets de retour. Sur une bonne pile TCP/IP, il ne devrait pas être en mesure de deviner les numéros de séquence, de sorte qu'il ne peut pas maintenir en place avec les attendus de la conversation.
OriginalL'auteur Tom Hawtin - tackline
Vous pouvez, comme vous l'avez déjà semblent être en train de faire, accept() de la connexion de toute façon, puis utiliser getInetAddress() pour vous assurer que l'adresse est autorisé. Si non, il suffit de fermer() la prise tout de suite.
127.0.0.1
est pas une adresse qui peut être usurpée.Sinon, vous pouvez installer votre propre gestionnaire de sécurité qui aura ses checkAccept() la méthode appelée avec le port et l'adresse du site distant. Thet est un peu plus difficile - je n'ai jamais essayé, depuis la première solution a toujours été suffisant pour moi.
Jerub: L'OP n'a pas compris que l'usurpation d'identité. Pax: Aucun ancien gestionnaire de sécurité va le faire, il vous suffit de définir une politique de donner les code les autorisations correctes (permission java.net.SocketPermission "127.0.0.1" "écouter et accepter", ou quelque chose comme ça - a besoin de rattraper le SecurityException de l'accepter).
OriginalL'auteur paxdiablo
OriginalL'auteur Selfmade Javaman
Lorsque vous liez votre ServerSocket, en précisant localhost doit faire de la pile TCP/IP de refuser la connexion. Même si cela ne fonctionne pas sur votre système, localhost ne peut pas (ok, peut-être que si quelqu'un a piraté votre pile TCP/IP et la passerelle par défaut du routeur) être usurpée, depuis que l'adresse n'est pas acheminé par le biais de l'interface physique.
Je suis curieux de savoir pourquoi votre liaison de ne pas réussir, qu'est-ce que votre système d'exploitation, la version de Java, etc?
OriginalL'auteur Steve Moyer