上次做了一个Ajax的Whois查询程序,收集了各种域名的WHOIS查询方法,现在发出来分享一下。域名的WHOIS信息一般指该域名的所有人、注册日期、过期日期等信息,这些信息由管理该顶级域名的管理机构提供,比如中国的CN域名由CNNIC提供,COM/NET由VeriSign提供。
域名WHOIS信息
查询域名的WHOIS信息,首先需要知道这个顶级域的WHOIS服务器,例如.com域名的WHOIS服务器为whois.verisign-grs.com或whois.crsnic.net,cn的WHOIS服务器为whois.cnnic.cn(在下文会提到)。打开HTTP连接,进入43端口,(重点,不是WEB服务器的80端口,国际通用的WHOIS服务器端口均为43),输入一个待查询的域名,以一个换行符结束,然后WHOIS服务器即可返回WHOIS信息。
PHP脚本:
- $domain = 'photozero.net';//待查询域名
- $tld = 'net';//顶级域,请自行用函数解析得出。别忘了判断域名合法性
- $server = 'whois.verisign-grs.com'; //net的WHOIS服务器地址。
- $fp = @fsockopen($server, 43, $errno, $errstr, 10);//打开SOCK连接
- $query = "$domain\r\n"; //输入查询字符,以换行符结束
- fputs($fp, $query);
- while (!feof($fp)){
- $data .= fgets($fp);//获取数据,$data即是返回的WHOIS信息
- }
- fclose($fp);
- echo $data;
此外,还有几点应该注意的地方。
一、 .com,.net的WHOIS信息要查询两次才能得到,什么意思呢?第一次查询是向VeriSign查询,查询的结果中仅包含注册商(如Godaddy),注册商的WHOIS服务器,注册日期,过期日期等基本信息,并不包含所有人信息(以及相关的邮件地址、电话、联系地址),而这些信息则要向域名注册商的WHOIS服务器查询获得。举例一下,查询example.com的WHOIS信息,首先连接Verisign查询得到类似结果:
Whois Server Version 2.0
Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.
Domain Name: EXAMPLE.COM
Registrar: RESERVED-INTERNET ASSIGNED NUMBERS AUTHORITY
Whois Server: whois.iana.org
Referral URL: http://res-dom.iana.org
Name Server: A.IANA-SERVERS.NET
Name Server: B.IANA-SERVERS.NET
Status: clientDeleteProhibited
Status: clientTransferProhibited
Status: clientUpdateProhibited
Updated Date: 26-mar-2004
Creation Date: 14-aug-1995
Expiration Date: 13-aug-2011
>>> Last update of whois database: Sat, 13 Sep 2008 06:36:06 EDT <<<
第一次的查询结果中包含了一个Whois Server的地址(请使用preg_match()函数获取WHOIS地址),然后需要向这个地址再查询example.com的WHOIS信息。接下来的返回结果就完全明了了:
IANA Whois Service
Domain: example.com
Name: IANA_RESERVED
Registrant:
Unavailable
Administrative Contact:
Unavailable
Technical Contact:
Unavailable
Nameserver Information:
Nameserver: a.iana-servers.net.
IP Address: 192.0.34.43
Nameserver: b.iana-servers.net.
IP Address: 193.0.0.236
Nameserver: c.iana-servers.net.
IP Address: 139.91.1.10
(不同的域名注册商返回的格式不同。)
二、.com,.net 的查询结果有可能有很多个,比如查询google.com,会发现前面有
GOOGLE.COM.ZZZZZ.GET.LAID.AT.WWW.SWINGINGCOMMUNITY.COM
GOOGLE.COM.ZZZZZ.DOWNLOAD.MOVIE.ONLINE.ZML2.COM
GOOGLE.COM.TW
...等一些并不是我们期待的结果(至于为什么我也不太清楚),这时候在查询com,net域名时在域名前加上 = 符号,即
- $query = "=$domain\r\n"; //查询COM.NET域名用这个
返回的结果依然很多,要提取正确的WHOIS信息建议得想方法才行。我们注意到规律:不是正确的查询结果开头是“Server Name:”,正确的查询结果是“Domain Name:”,这下容易了吧,先使用substr函数把“Domain Name:”前的无关内容去掉
- $newdata = substr($data,strpos($data,'Domain Name:'),strlen($data));
- //$data是刚才的数据,$newdata是去除无关的数据后的新数据
- preg_match('/Whois Server: ([A-Za-z0-9.]+)/', $newdata, $newserver);
- //用正则提取出真正要再次查询的WHOIS地址
- //得到类似 $newserver[1] = 'whois.markmonitor.com';
在查询COM/NET域名的时候务必注意这两个问题!至于其他域名,基本上只要向WHOIS服务器进行请求一次就能得到完整结果。
IP WHOIS
IP WHOIS不同于域名WHOIS,管理IP的机构分为北美的ARIN,亚太的APNIC,拉美的LACNIC,欧洲的RIPE,非洲的AFRINIC(具体见IANA的说明)。

查询IP WHOIS与域名WHOIS类似的地方在于均是打开WHOIS服务器的43端口,同样是输入域名后以换行符结尾即可。查询IP WHOIS,(无论是哪个组织管理的)首先向北美地区的ARIN服务器(whois.arin.net)进行查询,如果ARIN中有其信息,即可返回,如果ARIN并不管理该域名段,将给出该域名段的管理机构及WHOIS服务器,可以在返回的数据中找到类似于
ReferralServer: whois://whois.apnic.net
PHP提取该WHOIS地址:
- preg_match('/ReferralServer: whois:\/\/([A-Za-z0-9.]+)/', $result, $server);
- //$server[1] 即是准确的WHOIS服务器地址。
这时候再向该地址提交IP WHOIS查询即可获得准确信息。
顶级域名对应WHOIS服务器资料
该部分由本人根据IANA数据进行整理获得。注意,并非所有顶级域均提供WHOIS查询服务器,某些顶级域由于管理、或保护隐私出发,未提供WHOIS服务器,如果需要查询其WHOIS信息,应当通过“小偷”程序进行调用。
TXT 格式:tld.txt
PHP数组格式:tld.php.txt
这个列表已经是最全的列表了,包括目前世界上所以现行的顶级域。