Java 如何确定传入连接来自本地计算机
我有一个接受传入连接的SocketServer。出于安全原因,我应该只允许本地连接(来自运行服务器的机器的连接) 如何确定传入连接是否来自另一台机器?以下代码对此安全吗Java 如何确定传入连接来自本地计算机,java,networking,sockets,network-programming,Java,Networking,Sockets,Network Programming,我有一个接受传入连接的SocketServer。出于安全原因,我应该只允许本地连接(来自运行服务器的机器的连接) 如何确定传入连接是否来自另一台机器?以下代码对此安全吗 Socket socket = someServerSocket.accept(); String remoteAddress = socket .getInetAddress().getHostAddress(); if (!fromThisMachine(remoteAddress)) { // Not from t
Socket socket = someServerSocket.accept();
String remoteAddress = socket .getInetAddress().getHostAddress();
if (!fromThisMachine(remoteAddress)) {
// Not from this machine.
}
而fromThisMachine()
方法如下:
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;
}
thismachine的公共布尔值(字符串remoteAddress){
试一试{
枚举接口=NetworkInterface.getNetworkInterfaces();
while(interfaces.hasMoreElements()){
NetworkInterface NetworkInterface=interfaces.nextElement();
枚举地址=networkInterface.getInetAddresses();
while(addresses.hasMoreElements()){
InetAddress InetAddress=地址.nextElement();
字符串hostName=inetAddress.getHostName();
字符串hostAddr=inetAddress.getHostAddress();
if(hostName.equals(remoteAddress)| hostAddr.equals(remoteAddress)){
返回true;
}
}
}
}捕获(例外e){
e、 printStackTrace();
返回false;
}
日志(“从:“+remoteAddress”向服务器发出的未经授权的请求);
返回false;
}
谢谢,
Mohsen如果要限制来自本地主机的连接,请在打开ServerSocket时指定。如果只在localhost上侦听,则只能从localhost获取连接
int port = .....
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(socketAddress);
serverSocket.accept();
谢谢你,斯卡夫曼。下面的代码进行了一些操作(硬编码127.0.0.1) 如果我从InetAddress.getLocalHost()读取本地地址,则同一子网上的其他网络用户仍然可以看到我的服务器 Mohsen.InetAddress.getByName(null)始终返回环回地址。见
它不起作用。请看:我在192.168.0.1上,其他人在192.168.0.2上。我想拒绝他在192.168.0.1:端口上监听我的服务器套接字,但这个解决方案不起作用。这只是导致从我自己的机器连接到127.0.0.1:端口无法工作。这不是问题的答案。为什么它的标记不正确。其他答案也是错误的,在这种情况下,它应该是开放的,没有回答所有其他人谁提出了同样的问题。哦,是的,我忘记了
inetades.getLocalHost()
没有给你127.0.0.1,它给出了该本地主机的外部IP地址。我的错。是的,我发现InetAddress.getLocalHost()也不能像预期的那样工作。请注意,“我正在监听127.0.0.1,因此只有本地用户可以连接到我”的假设有时会失败-例如,如果您的计算机上运行代理,可以强制其代表远程用户连接到127.0.0.1。很好。要是我早知道就好了。我感到非常困惑。这是功能爬行最糟糕的例子之一。提供InetAddress.getLoopbackAddress()
会更干净。我只是偶然发现的。在某些情况下,我的应用程序中的地址字符串被置为空,而不是NPE,我的应用程序仍然单独发出嘎嘎声。这给我们上了一堂很有价值的课,让我们仔细阅读Java API并全神贯注。@AlexanderPogrebnyak,愚蠢的问题。。。“那怎么办?”吉利说。最初的问题是只接受本地主机的连接isLoopbackAddress
不会帮助您获取本地主机IP地址。它会提供IP4或IP6协议的环回地址吗?请不要只写IP4代码。我们需要尽快转换到IP6。
int port = .....
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(socketAddress);
serverSocket.accept();
int port = .....
SocketAddress socketAddress =
new InetSocketAddress( InetAddress.getByName( null ), port);
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(socketAddress);
serverSocket.accept();