2015-10-25 68 views
0

我試圖在PHP中獲取與域相關的DNS記錄的完整列表,如果可能的話。PHP dns_get_record子域名記錄缺失

我一直在尋找了一段時間,而大部分的回答相關問題的證明這樣的代碼:

$result = dns_get_record("php.net",DNS_ALL); 
print_r($result); 

然而,當我使用該代碼來檢查我的領域之一,也有很多的記錄丟失。根本沒有記錄顯示子域。

有可能得到一個域的DNS記錄的完整列表,以及任何子域的記錄,在PHP中,而不會提前知道這些子域是什麼?

+0

寫了這個:http://yrmailfrom.me/tools/dns/adv_dns.php來做到這一點。你不會得到所有的記錄。我結束了使用PEAR Net_DNS2並遍歷我想要的記錄類型和子域。真正獲得所有記錄的唯一方法是請求區域傳輸。大多數公共DNS服務器沒有發生。我將發佈我的代碼作爲參考答案。 – Twisty

回答

1

正如我張貼,我會建議使用梨網DNS2。下面是一個完整的示例:http://pastebin.com/bAriPVN9

當您執行查找時,我更願意檢查Google Public DNS(8.8.8.8),但您可能有其他偏好。下面是如何設置一個例子:

<?php 
if($_GET['showData']){ 
     echo "Posted: <pre>"; 
     print_r($_GET); 
     echo "</pre>\n"; 
} 

$host = trim($_GET['host']); 
require_once 'Net/DNS2.php'; 

switch($_GET['ns']){ 
     case "google": 
       $ns = array('8.8.8.8'); 
       break; 
     default: 
       if(isset($_GET['other'])){ 
         $ns = array($_GET['other']); 
       } else { 
         $ns = array($_GET['ns']); 
       } 
       break; 
} 

我的原代碼被安裝到像一個API工作。用戶可以進行GET或POST請求,並以不同的方式獲取結果記錄。這個項目並沒有朝着這個方向發展,但你會在代碼中看到一些額外的步驟。接下來,您要設置或選擇您要查找的記錄類型。

if(empty($_GET['r'])){ 
     // Set Default Record Types to lookup 
     $_GET['r'] = array('A', 'MX', 'SRV', 'TXT', 'CNAME', 'NS'); 
} 

我希望記錄,郵件交換記錄,服務記錄,文本,圓錐形記錄和名稱服務器記錄。我從來沒有用小寫測試,但沒有興趣發現是否有效。

然後我通過並選取了所有我想查找的子域。由於我有可能使用不同的名稱服務器,所以我不想讓它失敗。如果您要求ALL或*,NS可能會忽略該請求。要求一個特定的記錄,它總是會給你一個迴應。

if(empty($_GET['s'])){ 
     // Set Default Dub-Domains to lookup 
     $_GET['s']['a'] = array('root', 'ftp', 'list', 'mail', 'store', 'www'); 
     $_GET['s']['m'] = array('list'); 
     $_GET['s']['c'] = array('autodiscover'); 
     $_GET['s']['s'] = array('_sip._tls', '_sipfederationtls._tcp'); 
} 

現在我們可以開始迭代所有這些並收集結果。取決於記錄類型或資源數據元素,結果可能以不同方式返回。如果查找失敗,也許記錄不存在,我們必須處理。因此try{} catch()塊。

我實際上沒有查找名爲「root」的子域。我使用這個作爲第二級的佔位符:php.net與第三級域:www.php.net

$record_results = array(); 

foreach($_GET['r'] as $record){ 
     // A Records 
     if($record == "A"){ 
       if($_GET['s']['a'][0] == "root"){ 
         if($_GET['showData']){ 
           echo "<tr><td colspan='4'>Performing A Record lookup on $host</td></tr>\r\n"; 
         } 
         try { 
           $result = $r->query($host, 'A'); 
         } catch(Net_DNS2_Exception $e) { 
           //echo "::query() failed: ", $e->getMessage(), "\n"; 
           if(!$suppressNoData){ 
             printf("\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n", $host, "A", "No Data", 0); 
           } 
           continue; 
         } 

         // 
         // loop through the answer, printing out the A records returned. 
         // 
         foreach($result->answer as $arr) { 
           $data = $arr->address; 
           printf("\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n", $arr->name, $arr->type, $data, $arr->ttl); 
           $record_results[] = array(
             'domain' => $arr->name, 
             'type' => $arr->type, 
             'data' => $arr->address, 
             'ttl' => $arr->ttl 
           ); 
         } 
         unset($_GET['s']['a'][0]); 
       } 

我們再繼續通過,上$host爲每個不同的記錄追加$sub我們正在尋找和收集信息。

MX和SRV記錄可以返回大量不同的數據。例如,一個域可能有4個MX記錄。所以你會得到一個返回的數組,你必須篩選。我認爲我錯誤地複製/粘貼了該代碼塊兩次。

當然,這可能是更多的努力,但你得到正確的結果。我希望這可以幫助你走。

+0

我沒有忘記這個問題。我只是沒有時間來測試你的代碼。如果它有效,它會做我所需要的,我會將你的答案標記爲例外。謝謝你的幫助。 –

+0

Pastebin代碼中存在一些錯誤,但是當我糾正它們時,此腳本正常工作。謝謝您的幫助。 –

+0

我沒有機會測試我共享的代碼。我不得不從一個工作項目中提取它並刪除一些私人信息。 – Twisty