Java 如果我使用;“本地主机”;,是否保证客户是本地客户?(考虑到我可以编辑系统主机文件)
如果我使用解决方案:Java 如果我使用;“本地主机”;,是否保证客户是本地客户?(考虑到我可以编辑系统主机文件),java,security,dns,Java,Security,Dns,如果我使用解决方案: new ServerSocket(9090, 0, InetAddress.getByName("localhost")) …并且用户将其系统主机文件更改为以“本地主机”的身份访问我的网站,这是否会阻止非本地客户端的访问?(响应赏金呼叫) 和往常一样,在计算机安全方面,保证取决于攻击者的能力 袭击者跛脚,一无所知。然后是,localhost保证客户端的本地性 攻击者具有登录系统的权限,可以运行SSH到外部世界。然后没有保证-SSH可以通过隧道转发内部端口: 使用java服
new ServerSocket(9090, 0, InetAddress.getByName("localhost"))
…并且用户将其系统主机文件更改为以“本地主机”的身份访问我的网站,这是否会阻止非本地客户端的访问?(响应赏金呼叫)
和往常一样,在计算机安全方面,保证取决于攻击者的能力
localhost
保证客户端的本地性some.external.server:8080
的请求都将发送到目标框的localhost:9090
如今,VPS几乎不需要任何成本,因此攻击者可以轻松租用此类外部机箱,并将其用作本地主机和整个世界之间的代理
Host
头不是localhost
的所有请求来保护服务器。通过将头重写代理(如nginx)包含到转发链中,可以很容易地对其进行反测量李>
总结
正如您所看到的,保证意味着目标框中的用户必须受到严格限制:没有转发软件。这意味着拒绝用户访问系统实用程序,如ssh
,或以用户权限安装和/或运行它们。除非机顶盒是没有任何用户登录或软件重新配置的机顶盒,否则这种情况极不可能发生
本地主机地址
对该问题的第一条评论建议使用localhost
名称解析的技巧:
new ServerSocket(9090, 0, InetAddress.getByName("localhost"))
用户可能会覆盖localhost,使其不再是127.0.0.1
这样做的目的是将一条记录放在/etc/hosts
或c:\Windows\System32\Drivers\etc\hosts
上,将localhost
名称绑定到另一个IP地址
如果您的盒子与地址1.2.3.4有以太网连接,则线路
1.2.3.4 localhost
可能会导致localhost
地址的更改。如果发生这种情况,那么
new ServerSocket(9090, 0, InetAddress.getByName("localhost"))
将绑定外部网络接口上的端口9090,该接口可从机箱外部访问
我在Ubuntu18.04上试过这个,它成功了。我已成功连接到Pasific另一侧框中运行在localhost
上的应用程序
但是
很久以前,微软Windows开发者将localhost
硬编码为127.0.0.1
我用我的Windows 10框进行了检查。已确认:localhost
解析为127.0.0.1
。测试程序
package org.example;
import java.net.*;
import java.io.*;
public class TryLocalhost {
public static void main(String[] args) throws IOException {
System.out.println("localhost: " + InetAddress.getByName("localhost"));
}
}
产生
localhost: localhost/127.0.0.1
而hosts
文件试图将localhost
绑定到链接本地地址
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
192.168.0.198 localhost
注释是来自Microsoft的原始注释。是的,用户可能会覆盖localhost,使其不再是127.0.0.1为什么不
InetAddress.getLoopbackAddress()
?(J2SE 7+)无论InetAddress.getByName返回什么IP地址,它都是框的“本地”地址,因此通常是127.0.0.1
或框的任何其他IP地址,或者任何其他随机的外部IP地址,在这种情况下,ServerSocket
将失败,因为您无法开始侦听未绑定到box的IP地址。@PatrickMevzek我相信其目的是禁止侦听任何外部可访问的接口。@Alnitak是的,当然,但是如果客户端控制了box,即使您在127.0.0.1上侦听,客户端只需设置防火墙规则,将任何外部IP和给定端口上的所有传入流量重定向到127.0.0.1。因此,如果用户控制该框,应用程序没有很多保护,使用localhost
或127.0.0.1
可以提供基本相同级别的保证。因此,如果我没有登录系统的权限,在我的Windows中更改主机文件是不够的?@TomBrito,Windows中的localhost
硬编码为127.0.0.1
。今天我在Windows 10中编辑了主机
,但InetAddress.getByName(“localhost”)
一直解析为127.0.0.1
。它仍然在Linux上工作——在Ubuntu 18.04上试用过。因此,在现代Windows机器上,您可以肯定localhost==127.0.0.1
@TomBrito在答案中添加了localhost故事。实际上,我现在只是想,您需要更改服务器机器上的hosts文件,对吗?在本地Ubuntu机器上更改它无法欺骗服务器将“localhost”解析为机器上的内容。。。是吗?@TomBrito,是的,必须在执行InetAddress.getByName(“localhost”)
的框中修改主机文件。那是在服务器上。在客户端愚弄主机没有任何效果。注意,更改主机文件需要登录访问权限和管理员权限。