如何通过PHP知道IP的域?
我已经使用了这个代码
<?php
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
echo $hostname;
?>
但是它不能正常工作。例如:
gethostbyaddr(62.75.138.253);
域名是earthwar.de,但正确答案是german-proxy.de
请帮。
单个IP地址可以承载无限数量的域。gethostbyaddr
返回的域将给出该IP的PTR DNS记录中的域名。反向DNS记录(PTR)将IP地址映射到一个或多个域名。
domaintools.com就是这样一家提供IP地址域情报的公司。你可以为他们收集到的信息付费。如果域名不在PTR记录中,那么您可以知道IP地址上有哪些域的唯一方法是尝试将域名解析为其IP地址并保存记录。恐怕没有别的办法了。
请参阅反向DNS查找和域工具反向IP查找
域名工具上反向IP查找的数据均基于其挖掘、收集和研究。
可以有多个name->IP映射,但只有一个 IP->名称映射。当您执行host->ip->host查找时,通常会得到一个完全不同的主机名。你无法确定用户指定的主机名,除非他们使用的协议将该主机名与请求一起传输,例如http 1.1。
你的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
>
是一个很好的例子。事实是:你对此无能为力,老兄!
您不能信任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查找。这是一条很长的路要走,但你可以相信我,当我说这是一个有趣的过程。