首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現標準 IP Whois 查詢:從根服務器到區域數據的完整流程

     編輯:PHP 綜合知識

IP Whois 查詢的核心架構

因為互聯網發展的歷史緣由,ARIN(美國互聯網號碼註冊機構)負責全球 IP 地址的整體規劃,並直接管理北美及部分非洲地區的 IP 分配。與此對應,whois.arin.net 是 IP Whois 查詢的根服務器。標準查詢流程分為兩步:首先向根服務器查詢目標 IP 所屬的區域註冊機構(RIR),再向該機構的 Whois 服務器獲取詳細信息。

五大區域互聯網註冊機構(RIR)

目前 IPv4 地址由五大 RIR 管理:

  • ARIN(whois.arin.net):北美、部分非洲
  • APNIC(whois.apnic.net):亞太地區(含亞洲、澳洲)
  • RIPE NCC(whois.ripe.net):歐洲、中東、北非
  • LACNIC(whois.lacnic.net):拉丁美洲及加勒比海
  • AFRINIC:非洲地區(早期由 ARIN 代管)

Whois 協議通訊流程

查詢過程基於 TCP 43 端口:

  1. 建立到 Whois 服務器的 TCP 連接
  2. 發送查詢字符串(IP 或域名)並以 \r\n 結尾
  3. 若查詢多個目標,以空格分隔
  4. 從 Socket 讀取返回數據,直到服務器主動斷開連接

PHP 實現核心代碼

以下實現包含 IP 格式驗證、根服務器查詢、Referral 追蹤及結果輸出:

<?php
include_once "lang.inc.php";

$ip = isset($_GET['ip']) ? $_GET['ip'] : 'blank';
if (-1 === ip2long($ip)) {
    die(str_replace('%IP%', $ip, $Text['ip_invalid']));
}

echo GetWhois($ip);

function GetWhois($ip) {
    global $Text;
    $rootWhois = 'whois.arin.net';
    $buffer = str_replace('%SERVER%', $rootWhois, $Text['sock_connect']);
    $response = ReadSocket($rootWhois, $ip);

    if ($response !== '') {
        $referral = SubStrByTag("ReferralServer: whois://", "\n", $response);
        // 移除端口號 :43
        if (($pos = strpos($referral, ":")) !== false) {
            $referral = substr($referral, 0, $pos);
        }

        if ($referral !== '') {
            $buffer .= str_replace('%SERVER%', $referral, $Text['sock_connect']);
            $buffer .= ReadSocket($referral, $ip);
        } else {
            $buffer .= $response;
        }
    }
    return nl2br($buffer);
}

function SubStrByTag($firstTag, $secondTag, &$longStr) {
    $firstPos = strpos($longStr, $firstTag);
    $ret = '';
    if ($firstPos !== false) {
        $secondPos = strpos($longStr, $secondTag, $firstPos);
        if ($secondPos !== false) {
            $firstPos += strlen($firstTag);
            $ret = substr($longStr, $firstPos, $secondPos - $firstPos);
        }
    }
    return $ret;
}

function ReadSocket($whois, $ip) {
    global $Text;
    $buffer = '';
    if (!$sock = fsockopen($whois, 43, $errNum, $errStr, 20)) {
        $buffer = str_replace('%SERVER%', $whois, $Text['sock_fail']);
    } else {
        fputs($sock, "$ip\n");
        while (!feof($sock)) {
            $buffer .= fgets($sock, 8192);
        }
        fclose($sock);
    }
    return $buffer;
}
?>

語言包文件 (lang.inc.php)

<?php
$Text = array(
    'ip_invalid' => '請輸入有效 IP,當前輸入:[%IP%]',
    'sock_connect' => '正在連接 %SERVER% ... <br>',
    'sock_fail' => '無法連接到主機:%SERVER%'
);
?>

其他常見 Whois 服務器

  • Tucows (whois.opensrs.net):單連接限制,DNSStuff 即使用此服務
  • BulkRegister (whois.bulkregister.net):大量查詢易被暫時封禁 IP
  • Network Solutions (whois.networksolutions.com):日限額 1000 次
  • Go Daddy (whois.godaddy.com)
  • Abuse.net (whois.abuse.net):專注濫用投訴查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved