【问题标题】:How I can know the Domain for an IP by PHP?我如何通过 PHP 知道 IP 的域?
【发布时间】:2012-01-30 05:37:39
【问题描述】:

我如何通过 PHP 知道 IP 的域?

我用过这段代码

<?php
  $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  echo $hostname;
?>

但它不能正常工作。例如:

gethostbyaddr(62.75.138.253);

域名是 earthwar.de 但正确答案是 German-proxy.de

请帮忙。

【问题讨论】:

  • 62.75.138.253 解析为 earthwar.de。但是 German-proxy.de 指向 62.75.138.253 但这并不意味着它是正确的主机名。许多域可以指向一个IP;但一个 IP 只能解析为一个主机名。例如,至少有 3 个域名指向该 IP。

标签: php get dns ip


【解决方案1】:

一个 IP 地址可以托管无限数量的域。 gethostbyaddr 返回的域将提供来自该 IP 的 PTR DNS 记录的域名。反向 DNS 记录 (PTR) 将 IP 地址映射到一个或多个域名。

domaintools.com 就是这样一家提供 IP 地址域情报的公司。您可以为他们收集的此类信息付费。如果域名不在 PTR 记录中,那么您可以知道 IP 地址上的域的唯一方法是尝试将域名解析为其 IP 地址并保存记录。 AFIK 没有其他办法。

Reverse DNS LookupDomain tools reverse IP lookup

在域工具上反向IP查找的数据都是基于它们的挖掘、收集和研究。

【讨论】:

  • 不客气。如果您知道 IP 和域,则可以尝试将主机解析为 ip 并查看它们是否匹配。但是,如果您只有 IP 并且想要确定域,则 IP 可能不会(也可能不会)返回您可能正在寻找的域。
【解决方案2】:

可以有许多名称->IP 映射,但只有一个 IP->名称映射。当您进行 host->ip->host 查找时,以完全不同的主机名结束并不罕见。您无法确定用户指定的主机名,除非他们使用的协议将该主机名与请求一起传输,例如http 1.1。大多数协议完全依赖 IP 地址工作,不需要/关心主机名。

【讨论】:

    【解决方案3】:

    你的 PHP 是正确的,earthwar.de 是正确的答案

    eugen@lucidhome:~$ nslookup
    > set q=ptr
    > 62.75.138.253
    Server:     192.168.232.1
    Address:    192.168.232.1#53
    
    Non-authoritative answer:
    253.138.75.62.in-addr.arpa  name = earthwar.de.
    
    Authoritative answers can be found from:
    > 
    

    这当然并不意味着其他名称(例如 German-proxy.de)不指向同一个地址,但无法找到所有这些名称。

    更新:

    eugen@lucidhome:~$ nslookup 
    > set q=a
    > german-proxy.de.     
    Server:     192.168.232.1
    Address:    192.168.232.1#53
    
    Non-authoritative answer:
    Name:   german-proxy.de
    Address: 62.75.138.253
    > earthwar.de.
    Server:     192.168.232.1
    Address:    192.168.232.1#53
    
    Non-authoritative answer:
    Name:   earthwar.de
    Address: 91.143.85.129
    > 
    

    所以这是一个很好的例子。事实是:你无能为力,伙计!

    【讨论】:

    • ping 另有说明... German-proxy.de 解析为 62.75.138.253,earthwar.de 从我所在的位置有 91.143.85.129。
    • ping 将名称转换为 IP 地址,但您希望将 IP 地址转换为名称。这两个过程完全不同,可能会产生不同(且相互冲突)的数据。
    • 非常感谢 Eugen Rieck
    【解决方案4】:

    您不能信任 gethostbyaddr 返回的名称。具有特定 IP 地址权限的 DNS 服务器可以返回任何主机名。

    通常,管理员会设置 DNS 服务器以使用正确的主机名进行回复,但恶意用户可能会将他/她的 DNS 服务器配置为使用不正确的主机名进行回复。当您对从 gethostbyaddr 返回的主机名调用 gethostbyname 并确保该名称解析为原始 IP 地址时,您可以避免陷入该陷阱。

    但还有更多...有时单个主机名可以映射到多个 IP 地址。

    var_dump(gethostbynamel('google.com')); 
    

    返回

    array(6) {
       [0]=>
            string(14) "173.194.69.104"
       [1]=>
            string(14) "173.194.69.147"
       [2]=>
            string(14) "173.194.69.105"
       [3]=>
            string(14) "173.194.69.106"
       [4]=>
            string(14) "173.194.69.103"
       [5]=>
            string(13) "173.194.69.99"
    }
    

    总而言之,您需要了解 DNS 挖掘和反向 DNS 查找。这是一条很长的路要走,但是当我说它很有趣时,你可以相信我。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2023-04-10
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2023-03-11
      • 2014-11-25
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多