Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我使用;“本地主机”;,是否保证客户是本地客户?(考虑到我可以编辑系统主机文件)_Java_Security_Dns - Fatal编程技术网

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
    保证客户端的本地性

  • 攻击者具有登录系统的权限,可以运行SSH到外部世界。然后没有保证-SSH可以通过隧道转发内部端口:

  • 使用java服务器在box上执行此命令将导致建立隧道。所有发往
    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”)
    的框中修改主机文件。那是在服务器上。在客户端愚弄主机没有任何效果。注意,更改主机文件需要登录访问权限和管理员权限。