当前位置: 首页 > 知识库问答 >
问题:

getCanonicalHostName()返回IP而不是主机名

关胜
2023-03-14

我寻找如何在堆栈溢出的Java中进行IP查找,但答案与我已经在做的匹配,并没有解决我的问题。

public void printHostname( String ip ) {
    System.out.println( InetAddresses.forString( ip ).getCanonicalHostName( ) );
}

问题:此代码与预期的一些IP广告,而不是与其他一些。

例如,对于IP 157.55.39.29,输出为:

msnbot-157-55-39-29.search.msn.com

根据Linuxhost命令,此结果似乎是正确的:

> host 157.55.39.29
29.39.55.157.in-addr.arpa domain name pointer msnbot-157-55-39-29.search.msn.com.
> host 123.125.71.75
75.71.125.123.in-addr.arpa domain name pointer baiduspider-123-125-71-75.crawl.baidu.com.
123.125.71.75
baiduspider-123-125-71-75.crawl.baidu.com

返回:
此IP地址的完全限定域名,如果安全检查不允许此操作,则返回IP地址的文本表示形式。

但我很确定这不是安全检查的问题...或者我不明白出了什么问题。

你有什么建议来解释这种行为吗?你有变通办法吗?

// first lookup the hostname
host = nameService.getHostByAddr(addr.getAddress());

/* check to see if calling code is allowed to know
 * the hostname for this IP address, ie, connect to the host
 */
if (check) {
    SecurityManager sec = System.getSecurityManager();
    if (sec != null) {
       sec.checkConnect(host, -1);
    }
}

/* now get all the IP addresses for this hostname,
 * and make sure one of them matches the original IP
 * address. We do this to try and prevent spoofing.
 */

 InetAddress[] arr = InetAddress.getAllByName0(host, check);

共有1个答案

姬泰
2023-03-14

问题在于java.net.inetadress有一个针对IP欺骗的特定过程。

它首先将名称解析为(an)ip地址(es)。这很好用。在您的例子中,结果是两个IP请求。inetadress然后检查这些代理是否(至少有一个)解析为原始输入名称。

如果他们没有,它只是返回原始的ip地址。下图显示了检查baiduspider-123-125-71-75.crawl.baidu.com后的情况

nslookup baiduspider-123-125-71-75.crawl.baidu.com
Server:     192.168.2.1
Address:    192.168.2.1#53

Non-authoritative answer:
Name:   baiduspider-123-125-71-75.crawl.baidu.com
Address: 62.157.140.133
Name:   baiduspider-123-125-71-75.crawl.baidu.com
Address: 80.156.86.78

字符串addr=address.gethostname(inetaddress.getbyname("123.125.71.75“);输出与预期一样baiduspider-123-125-71-75.crawl.baidu.com

免责声明:由于我是一名Java开发人员,而不是安全专家,所以我并不完全了解使用伪造的ip地址所带来的安全影响。

 类似资料:
  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我使用Spring Cloud Eureka Server和Config Server作为Discovery First,我的问题是: 当服务注册中心在eureka服务器中自行运行时,它返回的配置服务器URL为http://LOCALHOST:8888http://{HOST_NAME}}:8888的intead和其他服务器中托管的所有其他服务都找不到其配置。 日志行: 正在从以下位置的服务器获取

  • 有没有办法让这起作用?修改IP地址(例如)是可以接受的。 我考虑过的事情: > 打开它,并根据IP地址标识所有主机:

  • 问题内容: 这是我的发件人实体 当我尝试执行以下查询时: 发生以下错误: 错误:org.hibernate.property.BasicPropertyAccessor- HHH000123:类中的IllegalArgumentException:be.gimme.persistence.entities.Sender,属性的设置方法:senderId 错误:org.hibernate.prope

  • 我正在使用Yaml(和Python!)第一次。我试图从一个.yaml文件中加载多个文档,但没有得到我所期望的结果。我正在期待一个包含每个文档的dicts的dict返回,但却得到了一个生成器对象...?我应该注意到,当我在前面的测试中对单个文档yaml文件使用yaml.load()(而不是load_all())时,我能够很好地取回一个字典。 ...产生以下终端输出: