PHP dns_get_record缺少子域的记录

时间:2015-10-25 06:01:46

标签: php dns

我试图在PHP中获取与域相关的DNS记录的完整列表(如果可能的话)。

我一直在搜索,相关问题的大多数答案都显示如下代码:

class BankAccount {
  @Input() bankName: string;
  @Input('account-id') id: string;
  // this property is not bound, and won't be automatically updated by Angular
  normalizedBankName: string;
}

但是,当我使用该代码检查我的某个域时,会丢失很多记录。子域名根本没有显示任何记录。

可以在PHP中获取域的DNS记录的完整列表以及任何子域的记录,而不知道这些子域是什么?

1 个答案:

答案 0 :(得分:1)

正如我发布的那样,我建议使用Pear Net DNS2。以下是一个完整的示例:http://pastebin.com/bAriPVN9

当您进行查找时,我更愿意查看Google公共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');
}

我想要A记录,邮件交换记录,服务记录,文本,圆锥记录和名称服务器记录。我从未测试过小写,但没有兴趣发现是否有效。

然后我经历了挑选我想要查找的所有子域名。由于我可能使用不同的名称服务器,所以我不想让它失去理智。如果您要求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()阻止。

我实际上并没有查找名为&#39; root&#39;的子域名。我将其用作第二级的占位符: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]);
                }

然后,我们会继续$sub$host附加到{{1}},以查找我们正在查找的每个不同记录并收集详细信息。

MX和SRV记录可以返回大量不同的数据。例如,域可能有4个MX记录。因此,您将获得一个必须筛选的对象数组。我想我偶然复制/粘贴了两次代码块。

当然,您可能会付出更多努力,但却能获得正确的结果。我希望这有助于你前进。